线程应该等待在kext编程中完成设备请求

时间:2013-12-23 13:44:45

标签: xcode multithreading macos network-programming kernel-extension

我正在开发mac上的设备驱动程序。我的问题是我们如何使设备请求异步同步。就像我向设备发送一个send encapsulated命令,并在获得中断管道通知后使用get encapsulated命令获取响应。 所以我怎么能让我的线程等到所有上述请求都没有完成(发送和获取)。

1 个答案:

答案 0 :(得分:0)

你可能需要更具体一点。但一般来说,如果你需要一个线程睡眠,直到你的某个函数在另一个线程上被调用,你可以使用xnu的事件系统。由于这是设备驱动程序,我假设您正在使用I / O Kit - 在这种情况下,IO LocksIOCommandGate是最合适的。

使用显式锁定,在您的驱动程序实例中,您将拥有以下内容:

IOLock* lock;
bool cleared;

你会在某处初始化这些:

lock = IOLockAlloc();
cleared = false;

然后,当你的线程启动一些I / O时:

IOLockLock(lock);
cleared = false;
startYourIO(yourCallbackFunction);
while (!cleared)
{
  IOLockSleep(
    lock,
    &cleared, // using address of status variable as event
    THREAD_UNINT);
}
IOLockUnlock(lock);

在yourCallbackFunction中:

IOLockLock(lock);
cleared = true;
IOLockWakeup(
  lock,
  &cleared, // this must match the event pointer used in sleep
  true); // flip to false to wake up all waiting threads, not just 1
IOLockUnlock(lock);

显然,如果你有多个同步I / O,你的状态变量需要是每个上下文等等。在内核中,异步设计通常比同步更好。但我认为你对这种一般的驱动程序设计了如指掌,并且权衡利弊。

IOCommandGate睡眠/唤醒API非常相似,如果您在IOWorkLoop上进行线程同步,则应该使用它。如果你没有使用I / O Kit,你可能更喜欢使用BSD级别的锁/互斥API,这就是IOLock的实现方式。