Lines Matching defs:cache

30  *  memcache.c - routines that implement an in-memory cache.
64 /* Size used for calculation if given size of cache is 0 */
191 static int memcache_validate_basedn(LDAPMemCache *cache, const char *basedn);
195 static int memcache_adj_size(LDAPMemCache *cache, unsigned long size,
197 static int memcache_free_entry(LDAPMemCache *cache, ldapmemcacheRes *pRes);
198 static int memcache_expired(LDAPMemCache *cache, ldapmemcacheRes *pRes,
200 static int memcache_add_to_list(LDAPMemCache *cache, ldapmemcacheRes *pRes,
204 static int memcache_free_from_list(LDAPMemCache *cache, ldapmemcacheRes *pRes,
215 static int memcache_access(LDAPMemCache *cache, int mode,
218 static void memcache_print_list( LDAPMemCache *cache, int index );
219 static void memcache_report_statistics( LDAPMemCache *cache );
319 /* Create hash table for temporary cache */
330 /* Create hash table for primary cache */
349 LDAPDebug( LDAP_DEBUG_TRACE, "ldap_memcache_init new cache 0x%x\n",
358 ldap_memcache_set( LDAP *ld, LDAPMemCache *cache )
369 if (ld->ld_memcache != cache) {
375 /* First dissociate handle from old cache */
409 /* Exit if no new cache is specified */
410 if (cache == NULL) {
415 /* Then associate handle with new cache */
417 LDAP_MEMCACHE_MUTEX_LOCK( cache );
419 if ((nRes = memcache_adj_size(cache, sizeof(ldapmemcacheld),
421 LDAP_MEMCACHE_MUTEX_UNLOCK( cache );
428 memcache_adj_size(cache, sizeof(ldapmemcacheld),
433 pCur->ldmemcl_next = cache->ldmemc_lds;
434 cache->ldmemc_lds = pCur;
435 ld->ld_memcache = cache;
438 LDAP_MEMCACHE_MUTEX_UNLOCK( cache );
466 * the given cache. This should be called from a newly created thread since
471 ldap_memcache_update( LDAPMemCache *cache )
473 LDAPDebug( LDAP_DEBUG_TRACE, "ldap_memcache_update: cache 0x%x\n",
474 cache, 0, 0 );
476 if ( !NSLDAPI_VALID_MEMCACHE_POINTER( cache )) {
480 LDAP_MEMCACHE_MUTEX_LOCK( cache );
481 memcache_access(cache, MEMCACHE_ACCESS_UPDATE, NULL, NULL, NULL);
482 LDAP_MEMCACHE_MUTEX_UNLOCK( cache );
488 ldap_memcache_flush( LDAPMemCache *cache, char *dn, int scope )
491 "ldap_memcache_flush( cache: 0x%x, dn: %s, scope: %d)\n",
492 cache, ( dn == NULL ) ? "(null)" : dn, scope );
494 if ( !NSLDAPI_VALID_MEMCACHE_POINTER( cache )) {
498 LDAP_MEMCACHE_MUTEX_LOCK( cache );
501 memcache_access(cache, MEMCACHE_ACCESS_FLUSH_ALL, NULL, NULL, NULL);
503 memcache_access(cache, MEMCACHE_ACCESS_FLUSH,
507 LDAP_MEMCACHE_MUTEX_UNLOCK( cache );
513 ldap_memcache_destroy( LDAPMemCache *cache )
520 cache, 0, 0 );
522 if ( !NSLDAPI_VALID_MEMCACHE_POINTER( cache )) {
526 /* Dissociate all ldap handes from this cache. */
527 LDAP_MEMCACHE_MUTEX_LOCK( cache );
529 for (pNode = cache->ldmemc_lds; pNode; pNode = pNextNode, i++) {
531 cache->ldmemc_lds = pNode->ldmemcl_next;
540 LDAP_MEMCACHE_MUTEX_UNLOCK( cache );
543 if (cache->ldmemc_basedns) {
544 for (i = 0; cache->ldmemc_basedns[i]; i++) {
545 size += strlen(cache->ldmemc_basedns[i]) + 1;
546 NSLDAPI_FREE(cache->ldmemc_basedns[i]);
549 NSLDAPI_FREE(cache->ldmemc_basedns);
552 /* Free hash table used for temporary cache */
553 if (cache->ldmemc_resTmp) {
554 size += htable_sizeinbytes(cache->ldmemc_resTmp);
555 memcache_access(cache, MEMCACHE_ACCESS_DELETE_ALL, NULL, NULL, NULL);
556 htable_free(cache->ldmemc_resTmp);
559 /* Free hash table used for primary cache */
560 if (cache->ldmemc_resLookup) {
561 size += htable_sizeinbytes(cache->ldmemc_resLookup);
562 memcache_access(cache, MEMCACHE_ACCESS_FLUSH_ALL, NULL, NULL, NULL);
563 htable_free(cache->ldmemc_resLookup);
566 memcache_adj_size(cache, size, MEMCACHE_SIZE_NON_ENTRIES,
569 LDAP_MEMCACHE_MUTEX_FREE( cache );
571 NSLDAPI_FREE(cache);
578 current bind DN. The key is used in the cache for looking up cached
684 /* Searches the cache for the right cached entries, and if found, attaches
708 /* Search the cache and append the results to ld if found */
714 "ldap_memcache_result: key 0x%8.8lx found in cache\n",
718 "ldap_memcache_result: key 0x%8.8lx not found in cache\n",
733 /* Creates a new header in the cache so that entries arriving from the
759 /* Appends a chain of entries to an existing cache header. Parameter "bLast"
858 memcache_validate_basedn(LDAPMemCache *cache, const char *basedn)
862 if ( cache->ldmemc_basedns == NULL ) {
873 return (cache->ldmemc_basedns && cache->ldmemc_basedns[0] ?
878 for (i = 0; cache->ldmemc_basedns[i]; i++) {
879 if (memcache_compare_dn(basedn, cache->ldmemc_basedns[i],
936 memcache_adj_size(LDAPMemCache *cache, unsigned long size,
945 cache->ldmemc_size_used += size;
946 if ((cache->ldmemc_size > 0) &&
947 (cache->ldmemc_size_used > cache->ldmemc_size)) {
949 if (size > cache->ldmemc_size_entries) {
950 cache->ldmemc_size_used -= size;
953 cache->ldmemc_size_entries, 0, 0 );
957 while (cache->ldmemc_size_used > cache->ldmemc_size) {
958 if (memcache_access(cache, MEMCACHE_ACCESS_FLUSH_LRU,
960 cache->ldmemc_size_used -= size;
969 cache->ldmemc_size_entries += size;
971 cache->ldmemc_size_used -= size;
972 assert(cache->ldmemc_size_used >= 0);
974 cache->ldmemc_size_entries -= size;
978 if ( cache->ldmemc_size == 0 ) { /* no size limit */
981 cache->ldmemc_size_used, 0, 0 );
985 "free space: %ld bytes).\n", cache->ldmemc_size_used,
986 cache->ldmemc_size - cache->ldmemc_size_used, 0 );
993 /* Searches the cache for results for a particular search identified by
1018 /* Adds a new header into the cache as a place holder for entries
1036 /* Appends search entries arriving from the dir server to the cache. */
1054 the entries are moved from secondary to primary cache, and a time
1071 /* Removes entries from the temporary cache. */
1088 /* Wipes out everything in the temporary cache directory. */
1275 /* Frees a cache header. */
1277 memcache_free_entry(LDAPMemCache *cache, ldapmemcacheRes *pRes)
1295 memcache_adj_size(cache, size, MEMCACHE_SIZE_ENTRIES,
1302 /* Detaches a cache header from the list of headers. */
1304 memcache_free_from_list(LDAPMemCache *cache, ldapmemcacheRes *pRes, int index)
1314 if (cache->ldmemc_resHead[index] == pRes)
1315 cache->ldmemc_resHead[index] = pRes->ldmemcr_next[index];
1317 if (cache->ldmemc_resTail[index] == pRes)
1318 cache->ldmemc_resTail[index] = pRes->ldmemcr_prev[index];
1326 /* Inserts a new cache header to a list of headers. */
1328 memcache_add_to_list(LDAPMemCache *cache, ldapmemcacheRes *pRes, int index)
1330 if (cache->ldmemc_resHead[index])
1331 cache->ldmemc_resHead[index]->ldmemcr_prev[index] = pRes;
1333 cache->ldmemc_resTail[index] = pRes;
1336 pRes->ldmemcr_next[index] = cache->ldmemc_resHead[index];
1337 cache->ldmemc_resHead[index] = pRes;
1342 /* Appends a chain of entries to the given cache header. */
1366 memcache_print_list( LDAPMemCache *cache, int index )
1389 cache, name, 0 );
1390 for ( restmp = cache->ldmemc_resHead[index]; restmp != NULL;
1399 cache, name, 0 );
1405 memcache_expired(LDAPMemCache *cache, ldapmemcacheRes *pRes,
1408 if (!cache->ldmemc_ttl)
1414 cache->ldmemc_ttl);
1417 /* Operates the cache in a central place. */
1419 memcache_access(LDAPMemCache *cache, int mode,
1425 /* Add a new cache header to the cache. */
1431 nRes = htable_get(cache->ldmemc_resTmp, pData2, (void**)&pRes);
1444 nRes = memcache_adj_size(cache, size, MEMCACHE_SIZE_ENTRIES,
1447 nRes = htable_put(cache->ldmemc_resTmp, pData2, (void*)pRes);
1449 memcache_add_to_list(cache, pRes, LIST_TMP);
1451 memcache_free_entry(cache, pRes);
1453 /* Append entries to an existing cache header. */
1461 nRes = htable_get(cache->ldmemc_resTmp, pData1, (void**)&pRes);
1467 nRes = htable_remove(cache->ldmemc_resTmp, pData1, NULL);
1469 memcache_free_from_list(cache, pRes, LIST_TMP);
1470 memcache_free_entry(cache, pRes);
1474 nRes = memcache_adj_size(cache, size, MEMCACHE_SIZE_ENTRIES,
1478 nRes = htable_remove(cache->ldmemc_resTmp, pData1, NULL);
1480 memcache_free_from_list(cache, pRes, LIST_TMP);
1481 memcache_free_entry(cache, pRes);
1490 nRes = htable_remove(cache->ldmemc_resTmp, pData1, NULL);
1492 memcache_free_from_list(cache, pRes, LIST_TMP);
1497 if ((nRes = htable_put(cache->ldmemc_resLookup,
1500 memcache_add_to_list(cache, pRes, LIST_TTL);
1501 memcache_add_to_list(cache, pRes, LIST_LRU);
1503 memcache_free_entry(cache, pRes);
1511 nRes = htable_get(cache->ldmemc_resLookup, pData1, (void**)ppRes);
1515 if (!memcache_expired(cache, *ppRes, (unsigned long)time(0))) {
1516 memcache_free_from_list(cache, *ppRes, LIST_LRU);
1517 memcache_add_to_list(cache, *ppRes, LIST_LRU);
1521 nRes = htable_remove(cache->ldmemc_resLookup, pData1, NULL);
1523 memcache_free_from_list(cache, *ppRes, LIST_TTL);
1524 memcache_free_from_list(cache, *ppRes, LIST_LRU);
1525 memcache_free_entry(cache, *ppRes);
1529 /* Remove cached entries in the temporary cache. */
1534 if ((nRes = htable_remove(cache->ldmemc_resTmp, pData1,
1536 memcache_free_from_list(cache, pCurRes, LIST_TMP);
1537 memcache_free_entry(cache, pCurRes);
1540 /* Wipe out the temporary cache. */
1543 nRes = htable_removeall(cache->ldmemc_resTmp, (void*)cache);
1545 /* Remove expired entries from primary cache. */
1548 ldapmemcacheRes *pCurRes = cache->ldmemc_resTail[LIST_TTL];
1551 for (; pCurRes; pCurRes = cache->ldmemc_resTail[LIST_TTL]) {
1553 if (!memcache_expired(cache, pCurRes, curTime))
1556 nRes = htable_remove(cache->ldmemc_resLookup,
1559 memcache_free_from_list(cache, pCurRes, LIST_TTL);
1560 memcache_free_from_list(cache, pCurRes, LIST_LRU);
1561 memcache_free_entry(cache, pCurRes);
1564 /* Wipe out the primary cache. */
1567 ldapmemcacheRes *pCurRes = cache->ldmemc_resHead[LIST_TTL];
1569 nRes = htable_removeall(cache->ldmemc_resLookup, (void*)cache);
1571 for (; pCurRes; pCurRes = cache->ldmemc_resHead[LIST_TTL]) {
1572 memcache_free_from_list(cache, pCurRes, LIST_LRU);
1573 cache->ldmemc_resHead[LIST_TTL] =
1574 cache->ldmemc_resHead[LIST_TTL]->ldmemcr_next[LIST_TTL];
1575 memcache_free_entry(cache, pCurRes);
1577 cache->ldmemc_resTail[LIST_TTL] = NULL;
1579 /* Remove cached entries in both primary and temporary cache. */
1590 if (cache->ldmemc_basedns) {
1591 for (i = 0; cache->ldmemc_basedns[i]; i++) {
1592 if ((memcache_compare_dn(cache->ldmemc_basedns[i], dn,
1594 (memcache_compare_dn(dn, cache->ldmemc_basedns[i],
1598 if (cache->ldmemc_basedns[i] == NULL)
1606 for (pRes = cache->ldmemc_resHead[list_id]; pRes != NULL;
1633 nRes = htable_remove(cache->ldmemc_resLookup,
1636 memcache_free_from_list(cache, pRes, LIST_TTL);
1637 memcache_free_from_list(cache, pRes, LIST_LRU);
1639 nRes = htable_remove(cache->ldmemc_resTmp,
1642 memcache_free_from_list(cache, pRes, LIST_TMP);
1644 memcache_free_entry(cache, pRes);
1648 /* Flush least recently used entries from cache */
1651 ldapmemcacheRes *pRes = cache->ldmemc_resTail[LIST_LRU];
1659 nRes = htable_remove(cache->ldmemc_resLookup,
1662 memcache_free_from_list(cache, pRes, LIST_TTL);
1663 memcache_free_from_list(cache, pRes, LIST_LRU);
1664 memcache_free_entry(cache, pRes);
1677 memcache_report_statistics( LDAPMemCache *cache )
1681 if ( cache->ldmemc_stats.ldmemcstat_tries == 0 ) {
1684 hitrate = ( 100L * cache->ldmemc_stats.ldmemcstat_hits ) /
1685 cache->ldmemc_stats.ldmemcstat_tries;
1687 LDAPDebug( LDAP_DEBUG_STATS, "memcache 0x%x:\n", cache, 0, 0 );
1689 cache->ldmemc_stats.ldmemcstat_tries,
1690 cache->ldmemc_stats.ldmemcstat_hits, hitrate );
1691 if ( cache->ldmemc_size <= 0 ) { /* no size limit */
1693 cache->ldmemc_size_used, 0, 0 );
1696 cache->ldmemc_size_used,
1697 cache->ldmemc_size - cache->ldmemc_size_used, 0 );
1705 the cache. */
1842 /**************** Hash table callbacks for temporary cache ****************/
1990 LDAPMemCache *cache = (LDAPMemCache*)pData;
2012 memcache_free_from_list(cache, pCurRes, LIST_TMP);
2013 memcache_free_entry(cache, pCurRes);
2023 LDAPMemCache *cache = (LDAPMemCache*)pData;
2032 memcache_free_from_list(cache, pCurRes, LIST_TMP);
2033 memcache_free_entry(cache, pCurRes);
2038 /********************* Hash table for primary cache ************************/