int main() { cache_head_t cache; init_cache(&cache, 8); long long *data = cache_malloc(&cache); *data = 111111111; cache_free(&cache, data); data = cache_malloc(&cache); cache_free(&cache, data); return 0; }
int Cache_New (/*in*/ req * r, /*in*/ SV * pParam, /*in*/ IV nParamNdx, /*in*/ bool bTopLevel, /*in*/ tCacheItem * * pItem) { epTHX_ int rc ; HV * pProviderParam ; char * sProvider ; tProviderClass * pProviderClass ; tCacheItem * pNew = NULL ; SV * pKey = NULL ; const char * sKey = "" ; STRLEN len ; /* lprintf (r -> pApp, "XXXXX Cache_New [%d/%d] pProviders=%x %s pCacheItems=%x %s pCachesToRelease=%x %s\n", _getpid(), GetCurrentThreadId(), pProviders, IsBadReadPtr (pProviders,4 )?"bad":"ok", pCacheItems, IsBadReadPtr (pCacheItems, 4)?"bad":"ok", pCachesToRelease, IsBadReadPtr (pCachesToRelease, 4)?"bad":"ok") ; */ if (SvROK(pParam)) pParam = SvRV (pParam) ; if (SvTYPE(pParam) == SVt_PV) { /* change this to auto match later on ... */ pProviderParam = (HV *)SvRV(sv_2mortal (CreateHashRef (r, "type", hashtstr, "file", "filename", hashtsv, pParam, NULL) )) ; } else if (SvTYPE(pParam) == SVt_PVAV) { SV * * ppRV = av_fetch ((AV *)pParam, nParamNdx, 0) ; if (!ppRV || !*ppRV) { strncpy (r -> errdat1, "<provider missing>", sizeof(r -> errdat1) - 1) ; return rcUnknownProvider ; } if (!SvROK (*ppRV) || SvTYPE(pProviderParam = (HV *)SvRV (*ppRV)) != SVt_PVHV) { strncpy (r -> errdat1, "<provider missing, element is no hashref>", sizeof(r -> errdat1) - 1) ; return rcUnknownProvider ; } } else if (SvTYPE(pParam) == SVt_PVHV) { pProviderParam = (HV *)pParam ; } else { strncpy (r -> errdat1, "<provider missing, no description found>", sizeof(r -> errdat1) - 1) ; return rcUnknownProvider ; } sProvider = GetHashValueStr (aTHX_ pProviderParam, "type", "") ; pProviderClass = (tProviderClass *)GetHashValuePtr (r, pProviders, sProvider, NULL) ; if (!pProviderClass) { if (*sProvider) strncpy (r -> errdat1, sProvider, sizeof(r -> errdat1) - 1) ; else strncpy (r -> errdat1, "<provider missing>", sizeof(r -> errdat1) - 1) ; return rcUnknownProvider ; } pKey = newSVpv ("", 0) ; if (pProviderClass -> fAppendKey) if ((rc = (*pProviderClass -> fAppendKey)(r, pProviderClass, pProviderParam, pParam, nParamNdx - 1, pKey)) != ok) return rc ; sKey = SvPV(pKey, len) ; if ((pNew = Cache_GetByKey (r, sKey))) { Cache_ParamUpdate (r, pProviderParam, bTopLevel, "Update", pNew) ; if (pProviderClass -> fUpdateParam) if ((rc = (*pProviderClass -> fUpdateParam)(r, pNew -> pProvider, pProviderParam)) != ok) return rc ; } if (!pNew) { pNew = cache_malloc (r, sizeof(tCacheItem)) ; if (!pNew) { if (pKey) SvREFCNT_dec (pKey) ; return rcOutOfMemory ; } *pItem = NULL ; memset (pNew, 0, sizeof (tCacheItem)) ; Cache_ParamUpdate (r, pProviderParam, bTopLevel, NULL, pNew) ; pNew -> sKey = strdup (sKey) ; if (pProviderParam) { if ((rc = (*pProviderClass -> fNew)(r, pNew, pProviderClass, pProviderParam, pParam, nParamNdx - 1)) != ok) { if (pKey) SvREFCNT_dec (pKey) ; cache_free (r, pNew) ; return rc ; } if (pProviderClass -> fUpdateParam) if ((rc = (*pProviderClass -> fUpdateParam)(r, pNew -> pProvider, pProviderParam)) != ok) return rc ; } if (r -> Component.Config.bDebug & dbgCache) lprintf (r -> pApp, "[%d]CACHE: Created new CacheItem %s; expires_in=%d expires_func=%s expires_filename=%s cache=%s\n", r -> pThread -> nPid, sKey, pNew -> nExpiresInTime, pNew -> pExpiresCV?"yes":"no", pNew -> sExpiresFilename?pNew -> sExpiresFilename:"", pNew -> bCache?"yes":"no") ; SetHashValueInt (r, pCacheItems, sKey, (IV)pNew) ; } if (pKey) SvREFCNT_dec (pKey) ; *pItem = pNew ; return ok ; }