2016-06-28 68 views
1

在建立/删除回调(例如kauth_unlisten_scope)和回调本身(在xnu代码库,是的,我知道,它的日期)之间似乎没有同步, 。这会增加跟踪/消除回调的负担,并与扩展本身的调用同步。但是这也是有问题的,因为有一个窗口指出一个线程已经退出了回调并且实际返回了扩展代码。种族:在OSX卸载kext期间回调和删除回调

有什么模式可以正确回避这场比赛吗?或者,是否有任何来自Apple的文档表明他们已经正确地同步了这些内容?

回答

1

据我所知,没有100%可靠的方法来防止kauth回调注销竞争条件; API的设计很糟糕。 Apple自己实现/推荐一个简单的基于原子计数器的机制,您可以在Kauth-O-Rama example中看到。在中搜索gActivationCount KauthORama.c源文件。线程在增量之前或者在回调的减量之后仍然有一个很小的机会运行代码,但是我从来没有看到由此造成的崩溃。

+0

谢谢!我知道kauth-o-rama的例子,但是加入了一秒钟的延迟,但仍然有一场比赛让我感到不安。根据我的经验“你从未见过它”意味着我的顾客将在第零天达到目标。墨菲去野外。 – MJZ

+0

是的,它也让我感到害怕,但是如果你看一下这个例子,那里的评论基本上承认你不能在给定现有API的情况下干净地做到这一点,它只是被打破了。你可以提交雷达。我想这个问题也是你计划卸载生产中的kext的频率。如果它一直发生,那么是的,人们可能会击中它。在实践中,卸载像这样的kext通常是非常罕见的。 – pmdj

+0

是的,这很少见,但我是“如果可以发生,那么我应该修复它”,说服... – MJZ