AppleRAIDGlobals.cpp [plain text]
#include "AppleRAID.h"
AppleRAIDGlobals gAppleRAIDGlobals;
AppleRAIDGlobals::AppleRAIDGlobals()
{
IOLog1("AppleRAIDGlobals() initing\n");
raidGlobalLock = IORecursiveLockAlloc();
raidControllerReferences = 0;
}
AppleRAIDGlobals::~AppleRAIDGlobals()
{
IOLog1("AppleRAIDGlobals::~AppleRAIDGlobals called.\n");
assert(raidControllerReferences == 0);
if (raidGlobalLock) {
IORecursiveLockFree(raidGlobalLock);
raidGlobalLock = 0;
}
}
void AppleRAIDGlobals::lock(void)
{
IORecursiveLockLock(raidGlobalLock);
}
void AppleRAIDGlobals::unlock(void)
{
IORecursiveLockUnlock(raidGlobalLock);
}
bool AppleRAIDGlobals::islocked(void)
{
return IORecursiveLockHaveLock(raidGlobalLock);
}
AppleRAID * AppleRAIDGlobals::getController(void)
{
lock();
if (!raidController) {
IOLog1("AppleRAIDGlobals::getController - creating AppleRAID\n");
assert(raidControllerReferences == 0);
raidController = new AppleRAID;
if (raidController) {
raidController->init();
const OSSymbol * userClient = OSSymbol::withCStringNoCopy("AppleRAIDUserClient");
if (userClient) {
raidController->setProperty(gIOUserClientClassKey, (OSObject *)userClient);
userClient->release();
}
raidController->attach(IOService::getResourceService());
raidController->registerService();
}
}
if (raidControllerReferences++) raidController->retain();
unlock();
return raidController;
}
void AppleRAIDGlobals::releaseController(void)
{
lock();
if (raidController) {
if (--raidControllerReferences == 0) {
raidController->detach(IOService::getResourceService());
raidController->release();
raidController = 0;
} else {
raidController->release();
}
}
unlock();
}