PsmAddress Sm_rbt_create(char *file, int line, PsmPartition partition) { sm_SemId lock; PsmAddress rbt; SmRbt *rbtPtr; lock = sm_SemCreate(SM_NO_KEY, SM_SEM_FIFO); if (lock < 0) { putErrmsg("Can't create semaphore for rbt.", NULL); return 0; } rbt = Psm_zalloc(file, line, partition, sizeof(SmRbt)); if (rbt == 0) { sm_SemDelete(lock); putErrmsg("Can't allocate space for rbt object.", NULL); return 0; } rbtPtr = (SmRbt *) psp(partition, rbt); eraseTree(rbtPtr); rbtPtr->lock = lock; return rbt; }
static PsmAddress createNode(char *file, int line, PsmPartition partition, PsmAddress rbt, PsmAddress parent, PsmAddress data, SmRbtNode **buffer) { PsmAddress node; SmRbtNode *nodePtr; node = Psm_zalloc(file, line, partition, sizeof(SmRbtNode)); if (node == 0) { putErrmsg("Can't allocate space for rbt node.", NULL); return 0; } nodePtr = (SmRbtNode *) psp(partition, node); nodePtr->rbt = rbt; nodePtr->parent = parent; nodePtr->child[LEFT] = 0; nodePtr->child[RIGHT] = 0; nodePtr->data = data; if (buffer) /* Tree already has a root. */ { nodePtr->isRed = 1; *buffer = nodePtr; } else /* This is the first node in the tree. */ { nodePtr->isRed = 0; /* Root is always black. */ } return node; }
PsmAddress Sm_list_create(const char *fileName, int lineNbr, PsmPartition partition) { sm_SemId lock; PsmAddress list; SmList *listBuffer; lock = sm_SemCreate(SM_NO_KEY, SM_SEM_FIFO); if (lock < 0) { putErrmsg("Can't create semaphore for list.", NULL); return 0; } list = Psm_zalloc(fileName, lineNbr, partition, sizeof(SmList)); if (list == 0) { sm_SemDelete(lock); putErrmsg("Can't allocate space for list header.", NULL); return 0; } listBuffer = (SmList *) psp(partition, list); eraseList(listBuffer); listBuffer->lock = lock; return list; }
PsmAddress Sm_list_insert_before(const char *fileName, int lineNbr, PsmPartition partition, PsmAddress oldElt, PsmAddress data) { SmListElt *oldEltBuffer; PsmAddress list; SmList *listBuffer; PsmAddress elt; SmListElt *eltBuffer; CHKZERO(partition); CHKZERO(oldElt); oldEltBuffer = (SmListElt *) psp(partition, oldElt); CHKZERO(oldEltBuffer); if ((list = oldEltBuffer->list) == 0) { putErrmsg(_noListMsg(), NULL); return 0; } listBuffer = (SmList *) psp(partition, list); if (lockSmlist(listBuffer) == ERROR) { putErrmsg(_cannotLockMsg(), NULL); return 0; } elt = Psm_zalloc(fileName, lineNbr, partition, sizeof(SmListElt)); if (elt == 0) { unlockSmlist(listBuffer); putErrmsg(_noSpaceForEltMsg(), NULL); return 0; } eltBuffer = (SmListElt *) psp(partition, elt); eraseListElt(eltBuffer); eltBuffer->list = list; eltBuffer->data = data; eltBuffer->prev = oldEltBuffer->prev; eltBuffer->next = oldElt; if (oldEltBuffer->prev != 0) { eltBuffer = (SmListElt *) psp(partition, oldEltBuffer->prev); CHKZERO(eltBuffer); eltBuffer->next = elt; } else { listBuffer->first = elt; } oldEltBuffer->prev = elt; listBuffer->length += 1; unlockSmlist(listBuffer); return elt; }
static void *allocFromDgrMemory(const char *fileName, int lineNbr, size_t length) { PsmAddress address; void *block; address = Psm_zalloc(fileName, lineNbr, dgrwm, length); if (address == 0) { return NULL; } block = psp(dgrwm, address); memset(block, 0, length); return block; }
void *allocFromIonMemory(char *fileName, int lineNbr, size_t length) { PsmPartition ionwm = _ionwm(NULL); PsmAddress address; void *block; address = Psm_zalloc(fileName, lineNbr, ionwm, length); if (address == 0) { putErrmsg("Can't allocate ION working memory.", itoa(length)); return NULL; } block = psp(ionwm, address); memset(block, 0, length); return block; }
static PsmAddress finishInsertingAfter(const char *fileName, int lineNbr, PsmPartition partition, PsmAddress oldElt, SmListElt *oldEltBuffer, PsmAddress list, SmList *listBuffer, PsmAddress data) { PsmAddress elt; SmListElt *eltBuffer; elt = Psm_zalloc(fileName, lineNbr, partition, sizeof(SmListElt)); if (elt == 0) { unlockSmlist(listBuffer); putErrmsg(_noSpaceForEltMsg(), NULL); return 0; } eltBuffer = (SmListElt *) psp(partition, elt); eraseListElt(eltBuffer); eltBuffer->list = list; eltBuffer->data = data; eltBuffer->next = oldEltBuffer->next; eltBuffer->prev = oldElt; if (oldEltBuffer->next != 0) { eltBuffer = (SmListElt *) psp(partition, oldEltBuffer->next); CHKZERO(eltBuffer); eltBuffer->prev = elt; } else { listBuffer->last = elt; } oldEltBuffer->next = elt; listBuffer->length += 1; unlockSmlist(listBuffer); return elt; }
Object Sdr_malloc(const char *file, int line, Sdr sdrv, unsigned long nbytes) { //TODO check sdr type return Psm_zalloc(file, line, sdrv, nbytes); }