[英]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.