0

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

4

1 回答 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,您的状态变量将需要针对每个上下文等。在内核中,异步设计通常比同步设计更好。但是我假设您对这种通用驱动程序设计了如指掌,并且已经权衡了利弊。

IOCommandGatesleep/wake API 非常相似,如果您在IOWorkLoop. 如果您不使用 I/O 工具包,您可能更喜欢使用 BSD 级别的锁/互斥 API,这就是实现 IOLock 的方式。

于 2013-12-23T20:23:52.063 回答