/* call with cell write-locked and mutex held */ void cm_AddCellToIDHashTable(cm_cell_t *cellp) { int i; if (cellp->flags & CM_CELLFLAG_IN_IDHASH) return; i = CM_CELL_ID_HASH(cellp->cellID); cellp->idNextp = cm_data.cellIDHashTablep[i]; cm_data.cellIDHashTablep[i] = cellp; cellp->flags |= CM_CELLFLAG_IN_IDHASH; }
/* call with cell write-locked and mutex held */ void cm_AddCellToIDHashTable(cm_cell_t *cellp) { int i; lock_AssertWrite(&cm_cellLock); lock_AssertMutex(&cellp->mx); if (cellp->flags & CM_CELLFLAG_IN_IDHASH) return; i = CM_CELL_ID_HASH(cellp->cellID); cellp->idNextp = cm_data.cellIDHashTablep[i]; cm_data.cellIDHashTablep[i] = cellp; _InterlockedOr(&cellp->flags, CM_CELLFLAG_IN_IDHASH); }
cm_cell_t *cm_FindCellByID(afs_int32 cellID, afs_uint32 flags) { cm_cell_t *cp; afs_uint32 hash; lock_ObtainRead(&cm_cellLock); hash = CM_CELL_ID_HASH(cellID); for (cp = cm_data.cellIDHashTablep[hash]; cp; cp=cp->idNextp) { if (cellID == cp->cellID) break; } lock_ReleaseRead(&cm_cellLock); if (cp) cm_UpdateCell(cp, flags); return cp; }
/* call with cell write-locked and mutex held */ void cm_RemoveCellFromIDHashTable(cm_cell_t *cellp) { cm_cell_t **lcellpp; cm_cell_t *tcellp; int i; if (cellp->flags & CM_CELLFLAG_IN_IDHASH) { /* hash it out first */ i = CM_CELL_ID_HASH(cellp->cellID); for (lcellpp = &cm_data.cellIDHashTablep[i], tcellp = cm_data.cellIDHashTablep[i]; tcellp; lcellpp = &tcellp->idNextp, tcellp = tcellp->idNextp) { if (tcellp == cellp) { *lcellpp = cellp->idNextp; cellp->flags &= ~CM_CELLFLAG_IN_IDHASH; cellp->idNextp = NULL; break; } } } }
/* call with cell write-locked and mutex held */ void cm_RemoveCellFromIDHashTable(cm_cell_t *cellp) { cm_cell_t **lcellpp; cm_cell_t *tcellp; int i; lock_AssertWrite(&cm_cellLock); lock_AssertMutex(&cellp->mx); if (cellp->flags & CM_CELLFLAG_IN_IDHASH) { /* hash it out first */ i = CM_CELL_ID_HASH(cellp->cellID); for (lcellpp = &cm_data.cellIDHashTablep[i], tcellp = cm_data.cellIDHashTablep[i]; tcellp; lcellpp = &tcellp->idNextp, tcellp = tcellp->idNextp) { if (tcellp == cellp) { *lcellpp = cellp->idNextp; _InterlockedAnd(&cellp->flags, ~CM_CELLFLAG_IN_IDHASH); cellp->idNextp = NULL; break; } } } }