如何在 OS X 内核中实现带超时的递归互斥量?
How to implement recursive mutex with timeout in the OS X kernel?
我正在将 windows 设备驱动程序移植到 Mac OS X。windows 代码使用 KMUTEX。这是一个递归锁,可以被同一个线程多次获取。其他线程必须等待获取,但是如果超时就会获取失败。
I/O 套件的 IORecursiveLock 不会超时。我可以使用 BSD 锁或 Mach 锁。内核的 BSD 部分提供带有 msleep() 和 wakeup() 的条件变量。
我不清楚条件变量是否符合我的要求。
sem_timedwait(3) 在 BSD 上是在用户空间。
Keith Shortridge 提供了 userspace set_timedwait implementation。一个线程调用 sem_wait() 而另一个线程在发生超时时向第一个线程发送信号。
我可以将 Shortridge 的代码移植到内核,但我不想冒险搞砸它。 Google 没有其他见解。你能给我一个线索吗?
这个 link 可能会有帮助,根据文档这有你需要的东西,也许是方法 wait_result_tlck_mtx_sleep_deadline:
https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KernelProgramming/synchronization/synchronization.html#//apple_ref/doc/uid/TP30000905-CH218-BEHJDFCA
我正在将 windows 设备驱动程序移植到 Mac OS X。windows 代码使用 KMUTEX。这是一个递归锁,可以被同一个线程多次获取。其他线程必须等待获取,但是如果超时就会获取失败。
I/O 套件的 IORecursiveLock 不会超时。我可以使用 BSD 锁或 Mach 锁。内核的 BSD 部分提供带有 msleep() 和 wakeup() 的条件变量。
我不清楚条件变量是否符合我的要求。
sem_timedwait(3) 在 BSD 上是在用户空间。
Keith Shortridge 提供了 userspace set_timedwait implementation。一个线程调用 sem_wait() 而另一个线程在发生超时时向第一个线程发送信号。
我可以将 Shortridge 的代码移植到内核,但我不想冒险搞砸它。 Google 没有其他见解。你能给我一个线索吗?
这个 link 可能会有帮助,根据文档这有你需要的东西,也许是方法 wait_result_tlck_mtx_sleep_deadline: https://developer.apple.com/library/content/documentation/Darwin/Conceptual/KernelProgramming/synchronization/synchronization.html#//apple_ref/doc/uid/TP30000905-CH218-BEHJDFCA