Я пишу библиотеку / API для связи с моим драйвером устройства.
class pcie_dev
{
public:
pcie_dev(unsigned int bdf=0, int bar=-1);
~pcie_dev(void);
private:
ssize_t m_dev_handle; // device file
};
Конструктор pcie_dev
открывает файл устройства и обновляет m_dev_handle
.Он также создает новый поток, который выполняет вызовы IOCTL, которые большую часть времени будут спать.
pcie_dev::pcie_dev(unsigned int bdf, int bar)
{
ssize_t fd;
fd = open(DEV_FILENAME, O_RDWR | O_CLOEXEC);
if (fd == -1) {
throw std::runtime_error("could not open character device");
}
m_dev_handle = fd;
[do some stuffs]
std::thread threadIrq(threadProcess, m_dev_handle);
};
Новая функция потока - это не метод, это статическая функция вне класса, но в том же файле.
static void threadProcess(ssize_t m_dev_handle)
{
int result;
uint32_t subIrq;
while(1)
{
result = ioctl(m_dev_handle, PCIE_IOCTL_IRQ_PROCESS, (void*) NULL);
if (result == 0) {
printf("Process woke up\n");
}
}
}
- Я использую
m_dev_handle
для выполнения вызовов read / write / ioctl на устройство в основном процессе.Эти вызовы никогда не должны переходить в спящий режим. - Он также необходим в функции потока для выполнения вызовов ioctl.
Вопросы:
- Нужен ли механизм синхронизации для
m_dev_handle
?Синхронизация выполняется в коде драйвера для обработки вызовов чтения / записи / IOCTL. - Должна ли функция потока быть методом класса?
Чтобы знать:
- Новая нить спит большую часть времени.Водитель усыпляет нить.Он просыпается только тогда, когда водитель получает прерывание.