繁体   English   中英

基于IOKit的kext驱动程序中的Singleton类

[英]Singleton class in IOKit based kext driver

我有一个维护class IOSharedDataQueue : public IODataQueue类型的实例的class IOSharedDataQueue : public IODataQueue这是IOKit对象。

该类与主类的各种方法解耦并调用,该主类是基于IOKit的类(从IOService派生)。

在尝试将此类转换为单例时,我添加了具有以下实现的getInstance函数:

myclass& myclass::getInstance()
{
    static myclass instance;
    return instance;
}

但是,似乎c ++ 11初始化单例的方式应该在IOKit编译器中起作用,并且Xcode产生以下错误:

This initialization requires a guard variable, which the kernel does not support

事实是,它适用于不包含基于IOKIt的对象的类。

也许有人遇到这个问题,我还没有看到任何有关此限制的文档。

编辑:

我发现,如果我的类以任何方式都不包含任何IOResources对象,则可以将其设计为带有保护变量的单例。

但是,我仍然希望能够创建一些简单且包含在内的包装器,以在整个IOKit项目中使用它们而无需传递指针。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM