static CMPIConstClass *getClass(ClassRegister * cr, const char *clsName, void **id) { ClassRecord *crec; int r; CMPIConstClass *cc; char *buf; _SFCB_ENTER(TRACE_PROVIDERS, "getClass"); _SFCB_TRACE(1,("--- classname %s cReg %p",clsName,cr)); ClassBase *cb = (ClassBase *) cr->hdl; crec = cb->ht->ft->get(cb->ht, clsName); if (crec==NULL) { _SFCB_RETURN(NULL); } if (crec->cachedCls==NULL) { // fprintf(stderr,"--- reading class %s\n",clsName); r=gzseek(cr->f, crec->position, SEEK_SET); buf = (char *) malloc(crec->length); r=gzread(cr->f, buf, crec->length); cc = NEW(CMPIConstClass); cc->hdl = buf; cc->ft = CMPIConstClassFT; cc->ft->relocate(cc); crec->cachedCls=cc; cb->cachedCount++; if (cb->cachedCount>=cacheLimit) pruneCache(cr); ENQ_TOP_LIST(crec,cb->firstCached,cb->lastCached,nextCached,prevCached); } else { if (crec!=cb->firstCached) { DEQ_FROM_LIST(crec,cb->firstCached,cb->lastCached,nextCached,prevCached); ENQ_TOP_LIST(crec,cb->firstCached,cb->lastCached,nextCached,prevCached); } // fprintf(stderr,"--- in cache class %s\n",clsName); } _SFCB_RETURN(crec->cachedCls); }
void mprPruneCache(MprCache *cache) { pruneCache(cache, NULL); }