int SharedDataManager::clearCallback(TreeDescriptor treeId, int nid, char *callbackDescr) { int status = 0; CallbackManager *callbackManager = (CallbackManager *)callbackDescr; callbackManager->dispose(); lock.lock(); SharedMemNode *retNode = sharedTree.find(treeId, nid); //Remove the CallbackManager instance from the queue associated with the nid node if(retNode) { CallbackManager *callbackManagerHead = retNode->getData()->getCallbackManager(); if(callbackManagerHead == callbackManager) retNode->getData()->setCallbackManager(callbackManager->getNext()); else { CallbackManager *next = callbackManager->getNext(); CallbackManager *prev = callbackManager->getPrev(); if(prev) prev->setNext((char *)next); if(next) next->setPrev((char *)prev); } allocationManager.deallocateShared((char *)callbackManager, sizeof(CallbackManager)); status = 1; } lock.unlock(); return status; }
void *SharedDataManager::setCallback(TreeDescriptor treeId, int nid, void *argument, void (*callback)(int, void *)) { char *retPtr = NULL; int status = 0; lock.lock(); SharedMemNode *retNode = sharedTree.find(treeId, nid); if(!retNode) //No data has been written in the cache yet, or the not is not cacheable, //then create a nid node without data { SharedMemNodeData nodeData; nodeData.setNid(treeId, nid); sharedTree.insert(&nodeData, &lock); retNode = sharedTree.find(treeId, nid); } if(retNode) { //Create a new Callback manager and concatenate it to the linked list of Callback managers //associated with this nid node CallbackManager *callbackManager = (CallbackManager *)freeSpaceManager.allocateShared(sizeof(CallbackManager), &lock); CallbackManager *prevCallbackManager = retNode->getData()->getCallbackManager(); if(prevCallbackManager) prevCallbackManager->setPrev((char *)callbackManager); callbackManager->setNext((char *)retNode->getData()->getCallbackManager()); callbackManager->setPrev(NULL); retNode->getData()->setCallbackManager(callbackManager); callbackManager->initialize(nid, argument, callback); SharedMemNodeData *nodeData = retNode->getData(); nodeData->setWarm(true); lock.unlock(); return callbackManager; } else { lock.unlock(); return NULL; } }