代码之家  ›  专栏  ›  技术社区  ›  Zohar81

基于iokit的kext驱动程序中的singleton类

  •  1
  • Zohar81  · 技术社区  · 8 年前

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

    类是从主类的各种方法中分离和调用的,这些方法是基于iokit的类(派生自 IOService )

    在尝试将此类转换为singleton时,我添加了 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对象,它可以用guard变量设计为单例。

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

    1 回复  |  直到 8 年前
        1
  •  2
  •   pmdj    8 年前

    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