bool empty() { c_region.enter(); bool res = (active_buffers == 0); c_region.leave(); return res; }
int ServiceManager::registerService(waServiceFactory *service, GUID owner) { ASSERT(owner != INVALID_GUID); if (owner == INVALID_GUID) return 0; GUID svctype = GetServiceTypeL(service); cs.enter(); if (!services.multiHaveItem(svctype, service)) { services.multiAddItem(svctype, service); ownermap.addItem(service, owner); GUID svcguid = service->getGuid(); if (svcguid != INVALID_GUID) services_by_guid.addItem(svcguid, service); } cs.leave(); service->serviceNotify(SvcNotify::ONREGISTERED); #ifdef WASABI_COMPILE_SYSCB CallbackManager::issueCallback(SysCallback::SERVICE, SvcCallback::ONREGISTER, reinterpret_cast<long>(&svctype), reinterpret_cast<long>(service)); #endif return 1; }
int ServiceManager::release(void *svcptr) { if (svcptr == NULL) return 0; waServiceFactory *wsvc = NULL; cs.enter(); // note cs getting locked twice via release+unlock if (!lockmap.getItem(svcptr, &wsvc)) { cs.leave(); DebugString("WARNING: got release with no lock record!"); return 0; } unlock(svcptr); cs.leave(); ASSERT(wsvc != NULL); return wsvc->releaseInterface(svcptr); }
void ServiceManager::sendNotification(int msg, int param1, int param2) { cs.enter(); for (int x = 0; x < services.multiGetNumPairs(); x++) { for (int y = 0; ; y++) { waServiceFactory *svc; if (!services.multiGetItemDirect(x, y, &svc)) { break; } svc->serviceNotify(msg, param1, param2); } } cs.leave(); #ifdef WASABI_COMPILE_COMPONENTS // also notify components for (int i = 0; ; i++) { WaComponent *wac = ComponentManager::enumComponent(i); if (wac == NULL) break; wac->onNotify(WAC_NOTIFY_SERVICE_NOTIFY, msg, param1, param2); } #endif #ifdef WASABI_COMPILE_SYSCB // and syscallbacks CallbackManager::issueCallback(SysCallback::RUNLEVEL, msg); #endif }
void unlock() { #ifdef DEBUG if (!locked) throw "Already unlocked"; #endif cs->leave(); locked = false; }
void pop (_et &element) { data_avail.wait(); c_region.enter(); element = elements[first]; first = (first + 1) % element_count; active_buffers--; c_region.leave(); free_space.signal(); }
void push(const _et &element) { free_space.wait(); c_region.enter(); int next = (last + 1) % element_count; elements[last] = element; last = next; active_buffers++; c_region.leave(); data_avail.signal(); }
int ServiceManager::unlock(void *svcptr) { if (svcptr == NULL) return 0; waServiceFactory *wsvc = NULL; cs.enter(); if (!lockmap.getItem(svcptr, &wsvc)) { cs.leave(); DebugString("WARNING: got unlock with no lock record!"); return 0; } int r = lockmap.delItem(svcptr); ASSERT(r); //CUT // this might fail, client locking isn't enforceable //CUT clientmap.delItem(svcptr); cs.leave(); return 1; }
bool lock(SessionId owner,bool exclusive, unsigned timeout) { CTimeMon tm(timeout); sect.enter(); loop { unsigned num = owners.ordinality(); if (exclusive) { if (num==0) { owners.append(owner); exclusivenest = 1; break; } else if (exclusivenest && (owners.item(0)==owner)) { exclusivenest++; break; } } else if (!exclusivenest) { owners.append(owner); break; } waiting++; sect.leave(); unsigned remaining; if (tm.timedout(&remaining)||!sem.wait(remaining)) { sect.enter(); if (!sem.wait(0)) { waiting--; sect.leave(); return false; } } else sect.enter(); } sect.leave(); return true; }
bool push(const _et &element,long timeout) { if (free_space.wait(timeout) ) { c_region.enter(); int next = (last + 1) % element_count; elements[last] = element; last = next; active_buffers++; c_region.leave(); data_avail.signal(); return true; } return false; }
void unlock(SessionId owner) { sect.enter(); if (exclusivenest) { exclusivenest--; if (exclusivenest) { // still locked assertex(owners.item(0)==owner); sect.leave(); return; } } verifyex(owners.zap(owner)); if (owners.ordinality()==0) { exclusivenest = 0; if (waiting) { sem.signal(waiting); waiting = 0; } } else { assertex(!exclusivenest); } sect.leave(); }
int ServiceManager::deregisterService(waServiceFactory *service, int internal) { GUID svctype = GetServiceTypeL(service); // make sure it was there cs.enter(); if (services.multiHaveItem(svctype, service)) { // make sure there aren't still services issued by this guy // ASSERT(internal || !lockmap.reverseGetItem(service)); services.multiDelItem(svctype, service); ownermap.delItem(service); services_by_guid.reverseDelItem(service); } cs.leave(); service->serviceNotify(SvcNotify::ONDEREGISTERED); #ifdef WASABI_COMPILE_SYSCB CallbackManager::issueCallback(SysCallback::SERVICE, SvcCallback::ONDEREGISTER, reinterpret_cast<long>(&svctype), reinterpret_cast<long>(service)); #endif return 1; }
unsigned in_queue() { c_region.enter(); unsigned res = active_buffers; c_region.leave(); return res; }