void dcm_access(uint32_t inode,uint32_t sessionid) { uint32_t ih = DCM_INODE_HASH(inode); uint32_t p,pp,np; p = dcm_inodehash[ih]; while (p<DCM_TAB_LENG) { if (dcm_tab[p].inode == inode && dcm_tab[p].sessionid == sessionid) { /* move element to the end of LRU list */ if (dcm_lru_last!=p) { /* do it only if needed */ /* remove from LRU chain */ pp = dcm_tab[p].lruprev; np = dcm_tab[p].lrunext; if (pp<DCM_TAB_LENG) { dcm_tab[pp].lrunext = np; } else { dcm_lru_first = np; } if (np<DCM_TAB_LENG) { dcm_tab[np].lruprev = pp; } else { dcm_lru_last = pp; } /* add at the end of LRU chain */ dcm_tab[p].lruprev = dcm_lru_last; dcm_tab[p].lrunext = DCM_NIL; dcm_tab[dcm_lru_last].lrunext = p; dcm_lru_last = p; } dcm_tab[p].cacheok = 1; return; } p = dcm_tab[p].inext; } }
void dcm_modify(uint32_t inode,uint32_t sessionid) { uint32_t ih = DCM_INODE_HASH(inode); uint32_t p,pp,np; p = dcm_inodehash[ih]; while (p<DCM_TAB_LENG) { if (dcm_tab[p].inode == inode && dcm_tab[p].sessionid != sessionid) { /* move to the beginning of LRU chain */ if (p!=dcm_lru_first) { /* remove from LRU chain */ pp = dcm_tab[p].lruprev; np = dcm_tab[p].lrunext; if (pp<DCM_TAB_LENG) { dcm_tab[pp].lrunext = np; } else { dcm_lru_first = np; } if (np<DCM_TAB_LENG) { dcm_tab[np].lruprev = pp; } else { dcm_lru_last = pp; } /* add at the beginning of LRU chain */ dcm_tab[p].lruprev = DCM_NIL; dcm_tab[p].lrunext = dcm_lru_first; dcm_tab[dcm_lru_first].lruprev = p; dcm_lru_first = p; } /* remove from INODE chain */ pp = dcm_tab[p].iprev; np = dcm_tab[p].inext; if (pp<DCM_TAB_LENG) { dcm_tab[pp].inext = np; } else { dcm_inodehash[ih] = np; } if (np<DCM_TAB_LENG) { dcm_tab[np].iprev = pp; } /* mark as 'empty' */ dcm_tab[p].inode = 0; dcm_tab[p].inext = DCM_NIL; dcm_tab[p].iprev = DCM_NIL; // elcount--; /* p = INODE_NEXT(p) */ p = np; } else { p = dcm_tab[p].inext; } } }
int dcm_open(uint32_t inode,uint32_t sessionid) { uint32_t ih = DCM_INODE_HASH(inode); uint32_t p,pp,np; p = dcm_inodehash[ih]; while (p<DCM_TAB_LENG) { if (dcm_tab[p].inode == inode && dcm_tab[p].sessionid == sessionid) { /* move element to the end of LRU list */ if (dcm_lru_last!=p) { /* do it only if needed */ /* remove from LRU chain */ pp = dcm_tab[p].lruprev; np = dcm_tab[p].lrunext; if (pp<DCM_TAB_LENG) { dcm_tab[pp].lrunext = np; } else { dcm_lru_first = np; } if (np<DCM_TAB_LENG) { dcm_tab[np].lruprev = pp; } else { dcm_lru_last = pp; } /* add at the end of LRU chain */ dcm_tab[p].lruprev = dcm_lru_last; dcm_tab[p].lrunext = DCM_NIL; dcm_tab[dcm_lru_last].lrunext = p; dcm_lru_last = p; } return 1; } p = dcm_tab[p].inext; } /* move one element from the beginning to the end */ p = dcm_lru_first; /* remove from LRU chain */ pp = dcm_tab[p].lruprev; np = dcm_tab[p].lrunext; if (pp<DCM_TAB_LENG) { dcm_tab[pp].lrunext = np; } else { dcm_lru_first = np; } if (np<DCM_TAB_LENG) { dcm_tab[np].lruprev = pp; } else { dcm_lru_last = pp; } /* add at the end of LRU chain */ dcm_tab[p].lruprev = dcm_lru_last; dcm_tab[p].lrunext = DCM_NIL; dcm_tab[dcm_lru_last].lrunext = p; dcm_lru_last = p; /* then replace this element using current values */ if (dcm_tab[p].inode>0) { /* if element is not empty then remove it first */ /* remove from old INODE chain */ ih = DCM_INODE_HASH(dcm_tab[p].inode); pp = dcm_tab[p].iprev; np = dcm_tab[p].inext; if (pp<DCM_TAB_LENG) { dcm_tab[pp].inext = np; } else { dcm_inodehash[ih] = np; } if (np<DCM_TAB_LENG) { dcm_tab[np].iprev = pp; } // } else { // elcount++; } /* replace values and add to new INODE chain */ dcm_tab[p].inode = inode; dcm_tab[p].sessionid = sessionid; ih = DCM_INODE_HASH(inode); np = dcm_inodehash[ih]; dcm_tab[p].inext = np; dcm_tab[p].iprev = DCM_NIL; dcm_inodehash[ih] = p; if (np<DCM_TAB_LENG) { dcm_tab[np].iprev = p; } return 0; }