X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;ds=sidebyside;f=servers%2Fslapd%2Fback-meta%2Fdncache.c;h=32f427f72d492ace8cad02f8515abf6c7b712b94;hb=3c012a606b9b6d56a7bdf062806519eaa563db2e;hp=a37d1e7706e39956c8356ff9887f97b4a6abd0f9;hpb=02153708a01b580c69e57e41da6243d165bd43c1;p=openldap diff --git a/servers/slapd/back-meta/dncache.c b/servers/slapd/back-meta/dncache.c index a37d1e7706..32f427f72d 100644 --- a/servers/slapd/back-meta/dncache.c +++ b/servers/slapd/back-meta/dncache.c @@ -1,72 +1,29 @@ -/* - * Copyright 1998-2001 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file - * - * Copyright 2001, Pierangelo Masarati, All rights reserved. - * - * This work has been developed to fulfill the requirements - * of SysNet s.n.c. and it has been donated - * to the OpenLDAP Foundation in the hope that it may be useful - * to the Open Source community, but WITHOUT ANY WARRANTY. - * - * Permission is granted to anyone to use this software for any purpose - * on any computer system, and to alter it and redistribute it, subject - * to the following restrictions: - * - * 1. The author and SysNet s.n.c. are not responsible for the consequences - * of use of this software, no matter how awful, even if they arise from - * flaws in it. - * - * 2. The origin of this software must not be misrepresented, either by - * explicit claim or by omission. Since few users ever read sources, - * credits should appear in the documentation. - * - * 3. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software. Since few users - * ever read sources, credits should appear in the documentation. - * SysNet s.n.c. cannot be responsible for the consequences of the - * alterations. - * - * 4. This notice may not be removed or altered. - * +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . * - * This software is based on the backend back-ldap, implemented - * by Howard Chu , and modified by Mark Valence - * , Pierangelo Masarati and other - * contributors. The contribution of the original software to the present - * implementation is acknowledged in this copyright statement. + * Copyright 1999-2007 The OpenLDAP Foundation. + * Portions Copyright 2001-2003 Pierangelo Masarati. + * Portions Copyright 1999-2003 Howard Chu. + * All rights reserved. * - * A special acknowledgement goes to Howard for the overall architecture - * (and for borrowing large pieces of code), and to Mark, who implemented - * from scratch the attribute/objectclass mapping. - * - * The original copyright statement follows. - * - * Copyright 1999, Howard Chu, All rights reserved. - * - * Permission is granted to anyone to use this software for any purpose - * on any computer system, and to alter it and redistribute it, subject - * to the following restrictions: - * - * 1. The author is not responsible for the consequences of use of this - * software, no matter how awful, even if they arise from flaws in it. - * - * 2. The origin of this software must not be misrepresented, either by - * explicit claim or by omission. Since few users ever read sources, - * credits should appear in the documentation. - * - * 3. Altered versions must be plainly marked as such, and must not be - * misrepresented as being the original software. Since few users - * ever read sources, credits should appear in the - * documentation. - * - * 4. This notice may not be removed or altered. + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ +/* ACKNOWLEDGEMENTS: + * This work was initially developed by the Howard Chu for inclusion + * in OpenLDAP Software and subsequently enhanced by Pierangelo + * Masarati. */ #include "portable.h" #include +#include #include "slap.h" #include "../back-ldap/back-ldap.h" @@ -76,12 +33,12 @@ * The dncache, at present, maps an entry to the target that holds it. */ -struct metadncacheentry { - struct berval *dn; +typedef struct metadncacheentry_t { + struct berval dn; int target; time_t lastupdated; -}; +} metadncacheentry_t; /* * meta_dncache_cmp @@ -92,19 +49,16 @@ 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; - int d = cc1->dn->bv_len - cc2->dn->bv_len; - /* * case sensitive, because the dn MUST be normalized */ - return d != 0 ? d : strcmp( cc1->dn->bv_val, cc2->dn->bv_val ); + return ber_bvcmp( &cc1->dn, &cc2->dn); } /* @@ -115,22 +69,16 @@ 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; - - int d = cc1->dn->bv_len - cc2->dn->bv_len; - int cmp; + metadncacheentry_t *cc1 = ( metadncacheentry_t * )c1; + metadncacheentry_t *cc2 = ( metadncacheentry_t * )c2; /* * case sensitive, because the dn MUST be normalized */ - cmp = d != 0 ? d : strcmp( cc1->dn->bv_val, cc2->dn->bv_val ); - - return ( cmp == 0 ) ? -1 : 0; + return ( ber_bvcmp( &cc1->dn, &cc2->dn ) == 0 ) ? -1 : 0; } /* @@ -141,17 +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 = -1; + metadncacheentry_t tmp_entry, + *entry; + int target = META_TARGET_NONE; + + assert( cache != NULL ); + assert( ndn != NULL ); - tmp_entry.dn = ndn; + 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 ) { @@ -163,14 +113,9 @@ meta_dncache_get_target( */ if ( cache->ttl < 0 ) { target = entry->target; - } else { - - /* - * Need mutex? - */ - curr_time = time( NULL ); - if ( entry->lastupdated+cache->ttl > curr_time ) { + } else { + if ( entry->lastupdated+cache->ttl > slap_get_time() ) { target = entry->target; } } @@ -188,14 +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 != NULL ); + assert( ndn != NULL ); /* * if cache->ttl < 0, cache never expires; @@ -203,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; + 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; } - entry->dn = ber_bvdup( ndn ); - if ( entry->dn == 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; @@ -250,18 +197,21 @@ 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; - tmp_entry.dn = ndn; + assert( cache != NULL ); + assert( ndn != NULL ); + + tmp_entry.dn = *ndn; ldap_pvt_thread_mutex_lock( &cache->mutex ); entry = avl_delete( &cache->tree, ( caddr_t )&tmp_entry, meta_dncache_cmp ); - ldap_pvt_thread_mutex_lock( &cache->mutex ); + ldap_pvt_thread_mutex_unlock( &cache->mutex ); if ( entry != NULL ) { meta_dncache_free( ( void * )entry ); @@ -278,11 +228,8 @@ meta_dncache_delete_entry( */ void meta_dncache_free( - void *e -) + void *e ) { - struct metadncacheentry *entry = ( struct metadncacheentry * )e; - - ber_bvfree( entry->dn ); + free( e ); }