我正在Mac上开发设备驱动程序。我的问题是我们如何使设备请求异步到同步。就像我向设备发送一个发送封装的命令,并在收到中断管道的通知后使用获取封装的命令得到它的响应。所以我怎样才能让我的线程等到上述所有请求都没有完成(发送和获取)。
问问题
476 次
1 回答
0
你可能需要比这更具体一点。但一般来说,如果你需要一个线程休眠直到你的某个函数在另一个线程上被调用,你可以使用 xnu 的事件系统。由于这是一个设备驱动程序,我假设您使用的是 I/O 工具包——在这种情况下,IO 锁或IOCommandGate是最合适的。
使用显式锁,在您的驱动程序实例中,您将拥有如下内容:
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);
在你的回调函数中:
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
sleep/wake API 非常相似,如果您在IOWorkLoop
. 如果您不使用 I/O 工具包,您可能更喜欢使用 BSD 级别的锁/互斥 API,这就是实现 IOLock 的方式。
于 2013-12-23T20:23:52.063 回答