X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-meta%2Fdncache.c;h=32f427f72d492ace8cad02f8515abf6c7b712b94;hb=3c012a606b9b6d56a7bdf062806519eaa563db2e;hp=c1020c73409aeff4c88886e7a3120476ac345474;hpb=5422345e55c0ff5f5d4cf01a5aa3eb47de19eaad;p=openldap diff --git a/servers/slapd/back-meta/dncache.c b/servers/slapd/back-meta/dncache.c index c1020c7340..32f427f72d 100644 --- a/servers/slapd/back-meta/dncache.c +++ b/servers/slapd/back-meta/dncache.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1999-2005 The OpenLDAP Foundation. + * Copyright 1999-2007 The OpenLDAP Foundation. * Portions Copyright 2001-2003 Pierangelo Masarati. * Portions Copyright 1999-2003 Howard Chu. * All rights reserved. @@ -23,6 +23,7 @@ #include "portable.h" #include +#include #include "slap.h" #include "../back-ldap/back-ldap.h" @@ -32,12 +33,12 @@ * The dncache, at present, maps an entry to the target that holds it. */ -struct metadncacheentry { +typedef struct metadncacheentry_t { struct berval dn; int target; time_t lastupdated; -}; +} metadncacheentry_t; /* * meta_dncache_cmp @@ -48,12 +49,11 @@ struct metadncacheentry { */ int meta_dncache_cmp( - const void *c1, - const void *c2 -) + const void *c1, + const void *c2 ) { - struct metadncacheentry *cc1 = ( struct metadncacheentry * )c1; - struct metadncacheentry *cc2 = ( struct metadncacheentry * )c2; + metadncacheentry_t *cc1 = ( metadncacheentry_t * )c1; + metadncacheentry_t *cc2 = ( metadncacheentry_t * )c2; /* * case sensitive, because the dn MUST be normalized @@ -69,12 +69,11 @@ meta_dncache_cmp( */ int meta_dncache_dup( - void *c1, - void *c2 -) + void *c1, + void *c2 ) { - struct metadncacheentry *cc1 = ( struct metadncacheentry * )c1; - struct metadncacheentry *cc2 = ( struct metadncacheentry * )c2; + metadncacheentry_t *cc1 = ( metadncacheentry_t * )c1; + metadncacheentry_t *cc2 = ( metadncacheentry_t * )c2; /* * case sensitive, because the dn MUST be normalized @@ -90,20 +89,19 @@ meta_dncache_dup( */ int meta_dncache_get_target( - struct metadncache *cache, - struct berval *ndn -) + metadncache_t *cache, + struct berval *ndn ) { - struct metadncacheentry tmp_entry, *entry; - time_t curr_time; - int target = META_TARGET_NONE; + metadncacheentry_t tmp_entry, + *entry; + int target = META_TARGET_NONE; - assert( cache ); - assert( ndn ); + assert( cache != NULL ); + assert( ndn != NULL ); tmp_entry.dn = *ndn; ldap_pvt_thread_mutex_lock( &cache->mutex ); - entry = ( struct metadncacheentry * )avl_find( cache->tree, + entry = ( metadncacheentry_t * )avl_find( cache->tree, ( caddr_t )&tmp_entry, meta_dncache_cmp ); if ( entry != NULL ) { @@ -117,13 +115,7 @@ meta_dncache_get_target( target = entry->target; } else { - - /* - * Need mutex? - */ - curr_time = time( NULL ); - - if ( entry->lastupdated+cache->ttl > curr_time ) { + if ( entry->lastupdated+cache->ttl > slap_get_time() ) { target = entry->target; } } @@ -141,17 +133,17 @@ meta_dncache_get_target( */ int meta_dncache_update_entry( - struct metadncache *cache, - struct berval *ndn, - int target -) + metadncache_t *cache, + struct berval *ndn, + int target ) { - struct metadncacheentry *entry, tmp_entry; - time_t curr_time = 0L; - int err = 0; + metadncacheentry_t *entry, + tmp_entry; + time_t curr_time = 0L; + int err = 0; - assert( cache ); - assert( ndn ); + assert( cache != NULL ); + assert( ndn != NULL ); /* * if cache->ttl < 0, cache never expires; @@ -159,40 +151,39 @@ meta_dncache_update_entry( * else, cache is used with ttl */ if ( cache->ttl > 0 ) { - - /* - * Need mutex? - */ - curr_time = time( NULL ); + curr_time = slap_get_time(); } tmp_entry.dn = *ndn; ldap_pvt_thread_mutex_lock( &cache->mutex ); - entry = ( struct metadncacheentry * )avl_find( cache->tree, + entry = ( metadncacheentry_t * )avl_find( cache->tree, ( caddr_t )&tmp_entry, meta_dncache_cmp ); if ( entry != NULL ) { entry->target = target; entry->lastupdated = curr_time; + } else { - entry = ch_calloc( sizeof( struct metadncacheentry ), 1 ); + entry = ch_malloc( sizeof( metadncacheentry_t ) + ndn->bv_len + 1 ); if ( entry == NULL ) { - ldap_pvt_thread_mutex_unlock( &cache->mutex ); - return -1; + err = -1; + goto error_return; } - ber_dupbv( &entry->dn, ndn ); - if ( entry->dn.bv_val == NULL ) { - ldap_pvt_thread_mutex_unlock( &cache->mutex ); - return -1; - } + entry->dn.bv_len = ndn->bv_len; + entry->dn.bv_val = (char *)&entry[ 1 ]; + AC_MEMCPY( entry->dn.bv_val, ndn->bv_val, ndn->bv_len ); + entry->dn.bv_val[ ndn->bv_len ] = '\0'; + entry->target = target; entry->lastupdated = curr_time; err = avl_insert( &cache->tree, ( caddr_t )entry, meta_dncache_cmp, meta_dncache_dup ); } + +error_return:; ldap_pvt_thread_mutex_unlock( &cache->mutex ); return err; @@ -206,14 +197,14 @@ meta_dncache_update_entry( */ int meta_dncache_delete_entry( - struct metadncache *cache, - struct berval *ndn -) + metadncache_t *cache, + struct berval *ndn ) { - struct metadncacheentry *entry, tmp_entry; + metadncacheentry_t *entry, + tmp_entry; - assert( cache ); - assert( ndn ); + assert( cache != NULL ); + assert( ndn != NULL ); tmp_entry.dn = *ndn; @@ -237,11 +228,8 @@ meta_dncache_delete_entry( */ void meta_dncache_free( - void *e -) + void *e ) { - struct metadncacheentry *entry = ( struct metadncacheentry * )e; - - free( entry->dn.bv_val ); + free( e ); }