kext:在kextunload

时间:2016-11-18 01:29:03

标签: c multithreading unix kernel-extension

这些年来已被问过几次,我只是在检查是否有可接受的解决方案。

对于线程终止,我们使用通过ZFS从Solaris继承的标准Unix方式。所以线程有mutex和condvar,并以:

完成
    l2arc_thread_exit = 0;
    cv_broadcast(&l2arc_feed_thr_cv);
    thread_exit();
 }

并且主线程等待;

    mutex_enter(&l2arc_feed_thr_lock);
    cv_signal(&l2arc_feed_thr_cv);  /* kick thread out of startup */
    l2arc_thread_exit = 1;
    while (l2arc_thread_exit != 0)
        cv_wait(&l2arc_feed_thr_cv, &l2arc_feed_thr_lock);
    mutex_exit(&l2arc_feed_thr_lock);

相当直截了当地,问题出现在现有的线程信令父节点之间,实际到达thread_exit()的末尾,并且,父线程完成并且XNU通过释放所有内存来清理kextunload。

当然很少见,但可能会发生。通过在thread_exit()调用之前添加延迟,可以轻松突出显示。

是的,我可以在主线程完成之前放一个延迟,所以kextunload在线程消失后有更大的机会运行,但最终,能够确保线程实际上已经消失会很好。

互联网已建议调用thread_suspend()thread_resume(),直到返回KERN_TERMINATED为止。但APPLE对于我们实际可以调用的内容有点意思,我们无法链接这些调用。 (好吧,我可以,但没有一个睡眠循环,但是醒来会更好)

那么,有没有聪明的方法来处理这种同步? Apple法律方式?非苹果合法方式?

0 个答案:

没有答案