/*============================================================================ * tclhandleFreeIndex -- * Frees a handle table entry by index. * * Parameters: * o headerPtr (I) - A pointer to the table header. * o index (I) - The index of an entry. *---------------------------------------------------------------------------- * Returns: * The contents of the entry, if success, or NULL if an error occured. *---------------------------------------------------------------------------- */ void *tclhandleFreeIndex(tblHeader_pt headerPtr, unsigned long entryIdx) { tblHeader_pt tblHdrPtr = headerPtr; entryHeader_pt entryPtr, freeentryPtr; entryPtr = TBL_INDEX(tblHdrPtr, entryIdx); if ((entryIdx >= tblHdrPtr->tableSize) || (entryPtr->freeLink != ALLOCATED_IDX)) { return NULL; } entryPtr = USER_AREA(entryPtr); freeentryPtr = HEADER_AREA(entryPtr); freeentryPtr->freeLink = tblHdrPtr->freeHeadIdx; tblHdrPtr->freeHeadIdx = (((ubyte_pt) entryPtr) - tblHdrPtr->bodyPtr) / tblHdrPtr->entrySize; return entryPtr; }
int tclhandleReset(tblHeader_pt tblHdrPtr, int initEntries) { int entIdx, lastIdx; entryHeader_pt entryPtr; lastIdx = tblHdrPtr->tableSize; for (entIdx = 0; entIdx < lastIdx; entIdx++) { entryPtr = TBL_INDEX(tblHdrPtr, entIdx); if (entryPtr->freeLink == ALLOCATED_IDX) return TCL_ERROR; } free(tblHdrPtr->bodyPtr); tblHdrPtr->freeHeadIdx = NULL_IDX; tblHdrPtr->tableSize = initEntries; tblHdrPtr->bodyPtr = (ubyte_pt) malloc(initEntries * tblHdrPtr->entrySize); tclhandleLinkInNewEntries(tblHdrPtr, 0, initEntries); return TCL_OK; }
/*============================================================================= * tclhandleAlloc -- * Allocate a table entry, expanding if necessary. * * Parameters: * o headerPtr (I) - A pointer to the table header. * o handle (O) - If not NULL, the handle is returned here. * o entryIdxPtr (O) - If not NULL, the index is returned here. * Returns: * The a pointer to the entry. *----------------------------------------------------------------------------- */ entryHeader_pt tclhandleAlloc(tblHeader_pt headerPtr, char *handle, uint64_t *entryIdxPtr) { tblHeader_pt tblHdrPtr = (tblHeader_pt) headerPtr; entryHeader_pt entryPtr; int entryIdx; if (tblHdrPtr->freeHeadIdx == NULL_IDX) tclhandleExpandTable(tblHdrPtr, -1); entryIdx = tblHdrPtr->freeHeadIdx; entryPtr = TBL_INDEX(tblHdrPtr, entryIdx); tblHdrPtr->freeHeadIdx = entryPtr->freeLink; entryPtr->freeLink = ALLOCATED_IDX; if (handle) sprintf(handle, tblHdrPtr->handleFormat, entryIdx); if (entryIdxPtr) *entryIdxPtr = entryIdx; return USER_AREA(entryPtr); }