void fwAvlDeleteTree(struct FwAvlTree* tree, void (*dataDelete)(void* data)) { struct FwQNode* node = fwAvlSerialize(tree); struct FwQNode* tmp; while(node != NULL) { if(dataDelete) dataDelete(node->treeNode->data); free(node->treeNode); tmp = node; node = node->next; free(tmp); } free(tree); }
/************************************************************** * * dataCreate - create the DATA Object Data Structure & Semaphore, etc.. * * * RETURNS: * DATAOBJ_ID - if no error, NULL - if mallocing or semaphore creation failed * */ DATAOBJ_ID dataCreate(int dataChannel,char *idStr) /* int dataChannel - STM channel = 0 - 3, for the 4 four possible stm's in system */ { char tmpstr[80]; DATAOBJ_ID pDataObj; int tDRid, tMTid, tDEid; short sr; long memval; int cnt,slen; unsigned long maxNumOfEntries; unsigned long memAddr; if (idStr == NULL) { slen = 16; } else { slen = strlen(idStr); } /* ------- malloc space for STM Object --------- */ if ( (pDataObj = (DATA_OBJ *) malloc( sizeof(DATA_OBJ)) ) == NULL ) { errLogSysRet(LOGIT,debugInfo,"dataCreate: "); return(NULL); } /* zero out structure so we don't free something by mistake */ memset(pDataObj,0,sizeof(DATA_OBJ)); pDataObj->dspAppVersion = getDspAppVer(); pDataObj->dspMemSize = getMemSize(); /* -------------- setup given or default ID string ---------------- */ pDataObj->pIdStr = (char *) malloc(slen+2); if (pDataObj->pIdStr == NULL) { dataDelete(pDataObj); return(NULL); } if (idStr != NULL) strcpy(pDataObj->pIdStr,idStr); else strcpy(pDataObj->pIdStr,"dataObj"); /* -------------------------------------------------------------------*/ pDataObj->dataState = OK; /* create the STM State sync semaphore */ pDataObj->pSemStateChg = semBCreate(SEM_Q_FIFO,SEM_EMPTY); /* create the STM Object Mutual Exclusion semaphore */ pDataObj->pStmMutex = semMCreate(SEM_Q_PRIORITY | SEM_INVERSION_SAFE | SEM_DELETE_SAFE); if ( (pDataObj->pSemStateChg == NULL) || (pDataObj->pStmMutex == NULL) ) { errLogSysRet(LOGIT,debugInfo,"dataCreate: Could not create semaphore "); dataDelete(pDataObj); return(NULL); } /* Make initial buffer, msgQ, freelist, may expand */ maxNumOfEntries = MAX_BUFFER_ALLOCATION / ( sizeof(FID_STAT_BLOCK) + sizeof(ITR_MSG) + sizeof(long)); pDataObj->maxFidBlkBuffered = pDataObj->maxFreeList = maxNumOfEntries; pDataObj->pStatBlkArray = (FID_STAT_BLOCK*) malloc(sizeof(FID_STAT_BLOCK) * maxNumOfEntries); /* Free List of Tags, typically 0 - maxNumFidBlkToAlloc */ pDataObj->pTagFreeList = rngXBlkCreate(maxNumOfEntries, "Data Addr Free Pool ",EVENT_STM_ALLOC_BLKS,1); DPRINT1(-1," %lu MBytes of Memory.\n",(pDataObj->dspMemSize/1048576L)); pDataId = pDataObj; /* set internal static pointer */ return( pDataObj ); }