示例#1
0
文件: cache.c 项目: yuyang0/yaspider
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;
}
示例#2
0
文件: epcache.c 项目: gitpan/Embperl
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 ;
    }