1 /* cache.c - routines to maintain an in-core cache of entries */
3 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
4 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
7 * Copyright 2001 The OpenLDAP Foundation, All Rights Reserved.
8 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
10 * Copyright 2001, Pierangelo Masarati, All rights reserved. <ando@sys-net.it>
12 * This work has beed deveolped for the OpenLDAP Foundation
13 * in the hope that it may be useful to the Open Source community,
14 * but WITHOUT ANY WARRANTY.
16 * Permission is granted to anyone to use this software for any purpose
17 * on any computer system, and to alter it and redistribute it, subject
18 * to the following restrictions:
20 * 1. The author and SysNet s.n.c. are not responsible for the consequences
21 * of use of this software, no matter how awful, even if they arise from
24 * 2. The origin of this software must not be misrepresented, either by
25 * explicit claim or by omission. Since few users ever read sources,
26 * credits should appear in the documentation.
28 * 3. Altered versions must be plainly marked as such, and must not be
29 * misrepresented as being the original software. Since few users
30 * ever read sources, credits should appear in the documentation.
31 * SysNet s.n.c. cannot be responsible for the consequences of the
34 * 4. This notice may not be removed or altered.
43 #include "back-monitor.h"
46 * compares entries based on the dn
54 struct monitorcache *cc1 = ( struct monitorcache * )c1;
55 struct monitorcache *cc2 = ( struct monitorcache * )c2;
58 * case sensitive, because the dn MUST be normalized
60 return strcmp( cc1->mc_ndn, cc2->mc_ndn );
64 * checks for duplicate entries
72 struct monitorcache *cc1 = ( struct monitorcache * )c1;
73 struct monitorcache *cc2 = ( struct monitorcache * )c2;
76 * case sensitive, because the dn MUST be normalized
78 return ( strcmp( cc1->mc_ndn, cc2->mc_ndn ) == 0 ) ? -1 : 0;
82 * adds an entry to the cache and inits the mutex
86 struct monitorinfo *mi,
90 struct monitorcache *mc;
91 struct monitorentrypriv *mp;
97 mp = ( struct monitorentrypriv *)e->e_private;
98 ldap_pvt_thread_mutex_init( &mp->mp_mutex );
100 mc = ( struct monitorcache * )ch_malloc( sizeof( struct monitorcache ) );
101 mc->mc_ndn = e->e_ndn;
103 ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );
104 rc = avl_insert( &mi->mi_cache, ( caddr_t )mc,
105 monitor_cache_cmp, monitor_cache_dup );
106 ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
112 * locks the entry (no r/w)
119 struct monitorentrypriv *mp;
122 assert( e->e_private != NULL );
124 mp = ( struct monitorentrypriv * )e->e_private;
125 ldap_pvt_thread_mutex_lock( &mp->mp_mutex );
131 * gets an entry from the cache based on the normalized dn
136 struct monitorinfo *mi,
141 struct monitorcache tmp_mc, *mc;
143 assert( mi != NULL );
144 assert( ndn != NULL );
145 assert( ep != NULL );
147 tmp_mc.mc_ndn = ( char * )ndn;
148 ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );
149 mc = ( struct monitorcache * )avl_find( mi->mi_cache,
150 ( caddr_t )&tmp_mc, monitor_cache_cmp );
153 /* entry is returned with mutex locked */
154 monitor_cache_lock( mc->mc_e );
155 ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
161 ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
168 * If the entry exists in cache, it is returned in locked status;
169 * otherwise, if the parent exists, if it may generate volatile
170 * descendants an attempt to generate the required entry is
171 * performed and, if successful, the entry is returned
174 monitor_cache_dn2entry(
175 struct monitorinfo *mi,
184 struct monitorentrypriv *mp;
186 assert( mi != NULL );
187 assert( ndn != NULL );
188 assert( ep != NULL );
190 rc = monitor_cache_get( mi, ndn, ep );
191 if ( !rc && *ep != NULL ) {
195 /* try with parent/ancestors */
196 p_ndn = dn_parent( NULL, ndn );
197 rc = monitor_cache_dn2entry( mi, p_ndn, &e_parent );
199 if ( rc || e_parent == NULL) {
203 mp = ( struct monitorentrypriv * )e_parent->e_private;
205 if ( mp->mp_flags & MONITOR_F_VOLATILE_CH ) {
206 /* parent entry generates volatile children */
207 rc = monitor_entry_create( mi, ndn, e_parent, ep );
209 monitor_cache_release( mi, e_parent );
215 * releases the lock of the entry; if it is marked as volatile, it is
219 monitor_cache_release(
220 struct monitorinfo *mi,
224 struct monitorentrypriv *mp;
226 assert( mi != NULL );
228 assert( e->e_private != NULL );
230 mp = ( struct monitorentrypriv * )e->e_private;
232 if ( mp->mp_flags & MONITOR_F_VOLATILE ) {
233 /* volatile entries do not return to cache */
234 ldap_pvt_thread_mutex_destroy( &mp->mp_mutex );
241 ldap_pvt_thread_mutex_unlock( &mp->mp_mutex );