コード例 #1
0
ファイル: classProviderSf.c プロジェクト: mchasal/SFCB
static CMPIConstClass *
getResolvedClass(ClassRegister * cr, const char *clsName,
                 ClassRecord * crec, ReadCtl * rctl)
{
  _SFCB_ENTER(TRACE_PROVIDERS, "getResolvedClass");
  _SFCB_TRACE(1, ("--- classname %s cReg %p", clsName, cr));
  CMPIConstClass *cc = NULL,
      *cls;
  ReadCtl         ctl = *rctl;
  ClassBase      *cb = (ClassBase *) cr->hdl;

  if (crec == NULL) {
    crec = cb->ht->ft->get(cb->ht, clsName);
    if (crec == NULL)
      _SFCB_RETURN(NULL);
  }

  if (crec->cachedRCls == NULL) {
    cls = getClass(cr, clsName, &ctl);
    ClClass        *ccl = (ClClass *) cls->hdl;
    if (ccl->hdr.type == HDR_Class)
      return cls;

    char           *pn = (char *) cls->ft->getCharSuperClassName(cls);
    if (pn == NULL) {
      *rctl = ctl;
      return cls;
    }

    ClClass        *mc = ClClassNew(clsName, pn);
    cc = NEW(CMPIConstClass);
    cc->ft = CMPIConstClassFT;
    cc->hdl = mc;
    // printf("#-# merging %s %s\n",clsName,pn);
    mergeParents(cr, mc, pn, cls, rctl);

    if (*rctl == tempRead)
      _SFCB_RETURN(cc);

    crec->cachedRCls = cc;
    cb->cachedRCount++;
    if (cb->cachedRCount >= cSize)
      pruneRCache(cr);          /* should this be checking rSize? */
    ENQ_TOP_LIST(crec, cb->firstRCached, cb->lastRCached, nextRCached,
                 prevRCached);
  } else {
    // printf("-#- class %s in resolved cache
    // %p\n",clsName,crec->cachedRCls);
    if (crec != cb->firstRCached) {
      DEQ_FROM_LIST(crec, cb->firstRCached, cb->lastRCached, nextRCached,
                    prevRCached);
      ENQ_TOP_LIST(crec, cb->firstRCached, cb->lastRCached, nextRCached,
                   prevRCached);
    }
  }
  *rctl = cached;
  _SFCB_RETURN(crec->cachedRCls);
}
コード例 #2
0
ファイル: classProviderSf.c プロジェクト: zaneb/sblim-sfcb
static void pruneRCache(ClassRegister * cr)
{
   ClassBase *cb = (ClassBase *) (cr + 1);
   ClassRecord *crec;

   while (cb->cachedRCount>rSize) {
      crec=cb->lastRCached;
      DEQ_FROM_LIST(crec,cb->firstRCached,cb->lastRCached,nextRCached,prevRCached);
      CMRelease(crec->cachedRCls);
      crec->cachedRCls=NULL;
      cb->cachedRCount--;
   }
}
コード例 #3
0
ファイル: classProviderGz.c プロジェクト: zaneb/sblim-sfcb
static void pruneCache(ClassRegister * cr)
{
   ClassBase *cb = (ClassBase *) (cr + 1);
   ClassRecord *crec;
   while (cb->cachedCount>cacheLimit) {
      crec=cb->lastCached;
//    fprintf(stderr,"--- removing %s from cache\n",crec->cachedCls->ft->getCharClassName(crec->cachedCls));
      DEQ_FROM_LIST(crec,cb->firstCached,cb->lastCached,nextCached,prevCached);
      crec->cachedCls->ft->release(crec->cachedCls);
      crec->cachedCls=NULL;
      cb->cachedCount--;
   }   
}
コード例 #4
0
ファイル: classProviderSf.c プロジェクト: mchasal/SFCB
static CMPIConstClass *
getClass(ClassRegister * cr, const char *clsName, enum readCtl *ctl)
{
  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->cachedCCls == NULL) {
    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);

    if (*ctl == tempRead)
      _SFCB_RETURN(cc);
    // printf("-#- class %s Added %p\n",clsName,cc);

    crec->cachedCCls = cc;
    cb->cachedCCount++;
    if (cb->cachedCCount >= cSize)
      pruneCCache(cr);
    ENQ_TOP_LIST(crec, cb->firstCCached, cb->lastCCached, nextCCached,
                 prevCCached);
    *ctl = cached;
  } else {
    // printf("-#- class %s in cache %p\n",clsName,crec->cachedCCls);
    if (crec != cb->firstCCached) {
      DEQ_FROM_LIST(crec, cb->firstCCached, cb->lastCCached, nextCCached,
                    prevCCached);
      ENQ_TOP_LIST(crec, cb->firstCCached, cb->lastCCached, nextCCached,
                   prevCCached);
    }
  }
  *ctl = cached;
  _SFCB_RETURN(crec->cachedCCls);
}
コード例 #5
0
ファイル: classProviderGz.c プロジェクト: zaneb/sblim-sfcb
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);   
}