IOKIT对象被引用计数,并且必须始终用
new
被电话摧毁了
release()
. 因此,不管线程安全静态初始化器在kexts中不可用,无论如何都不应该静态地分配iokit对象。您可以使用原子指针或基于锁的机制在第一次调用函数时实例化对象,或者在固定时间创建实例。
作为显式单例的ioservice无论如何都是可疑的-您确定不应该使用基于ioresource的iokit匹配来创建单个实例吗?
我的建议是:
static myclass* singleton_instance;
myclass* myclass::getInstance()
{
if (singleton_instance == nullptr)
{
myclass* new_instance = new myclass();
new_instance->init();
if (!OSCompareAndSwapPtr(nullptr, new_instance, &singleton_instance))
{
new_instance->release();
}
}
return singleton_instance;
}
// TODO: release singleton_instance when kext unloads