*/
int
monitor_cache_cmp(
- const void *c1,
- const void *c2
-)
+ const void *c1,
+ const void *c2 )
{
monitor_cache_t *cc1 = ( monitor_cache_t * )c1;
monitor_cache_t *cc2 = ( monitor_cache_t * )c2;
*/
int
monitor_cache_dup(
- void *c1,
- void *c2
-)
+ void *c1,
+ void *c2 )
{
monitor_cache_t *cc1 = ( monitor_cache_t * )c1;
monitor_cache_t *cc2 = ( monitor_cache_t * )c2;
*/
int
monitor_cache_add(
- monitor_info_t *mi,
- Entry *e
-)
+ monitor_info_t *mi,
+ Entry *e )
{
monitor_cache_t *mc;
monitor_entry_t *mp;
*/
int
monitor_cache_lock(
- Entry *e
-)
+ Entry *e )
{
- monitor_entry_t *mp;
+ monitor_entry_t *mp;
- assert( e != NULL );
- assert( e->e_private != NULL );
+ assert( e != NULL );
+ assert( e->e_private != NULL );
- mp = ( monitor_entry_t * )e->e_private;
- ldap_pvt_thread_mutex_lock( &mp->mp_mutex );
+ mp = ( monitor_entry_t * )e->e_private;
+ ldap_pvt_thread_mutex_lock( &mp->mp_mutex );
- return( 0 );
+ return( 0 );
}
/*
*/
int
monitor_cache_get(
- monitor_info_t *mi,
- struct berval *ndn,
- Entry **ep
-)
+ monitor_info_t *mi,
+ struct berval *ndn,
+ Entry **ep )
{
monitor_cache_t tmp_mc, *mc;
assert( ndn != NULL );
assert( ep != NULL );
+ *ep = NULL;
+
tmp_mc.mc_ndn = *ndn;
ldap_pvt_thread_mutex_lock( &mi->mi_cache_mutex );
mc = ( monitor_cache_t * )avl_find( mi->mi_cache,
if ( mc != NULL ) {
/* entry is returned with mutex locked */
monitor_cache_lock( mc->mc_e );
- ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
*ep = mc->mc_e;
-
- return( 0 );
}
-
+
ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
- *ep = NULL;
- return( -1 );
+ return ( *ep == NULL ? -1 : 0 );
}
/*
*/
int
monitor_cache_dn2entry(
- Operation *op,
- SlapReply *rs,
- struct berval *ndn,
- Entry **ep,
- Entry **matched
-)
+ Operation *op,
+ SlapReply *rs,
+ struct berval *ndn,
+ Entry **ep,
+ Entry **matched )
{
monitor_info_t *mi = (monitor_info_t *)op->o_bd->be_private;
int rc;
}
if ( !rc ) {
+ monitor_cache_lock( *ep );
monitor_cache_release( mi, e_parent );
+
} else {
*matched = e_parent;
}
int
monitor_cache_release(
monitor_info_t *mi,
- Entry *e
-)
+ Entry *e )
{
monitor_entry_t *mp;
mc = avl_delete( &mi->mi_cache,
( caddr_t )&tmp_mc, monitor_cache_cmp );
ldap_pvt_thread_mutex_unlock( &mi->mi_cache_mutex );
- ch_free( mc );
+ if ( mc != NULL ) {
+ ch_free( mc );
+ }
ldap_pvt_thread_mutex_unlock( &mp->mp_mutex );
ldap_pvt_thread_mutex_destroy( &mp->mp_mutex );
return( 0 );
}
+static void
+monitor_entry_destroy( void *v_mc )
+{
+ monitor_cache_t *mc = (monitor_cache_t *)v_mc;
+
+ if ( mc->mc_e != NULL ) {
+ monitor_entry_t *mp;
+
+ assert( mc->mc_e->e_private != NULL );
+
+ mp = ( monitor_entry_t * )mc->mc_e->e_private;
+
+ if ( mp->mp_cb ) {
+ if ( mp->mp_cb->mc_free ) {
+ mp->mp_cb->mc_free( mc->mc_e,
+ mp->mp_cb->mc_private );
+ }
+ ch_free( mp->mp_cb );
+ }
+
+ ldap_pvt_thread_mutex_destroy( &mp->mp_mutex );
+
+ ch_free( mp );
+ mc->mc_e->e_private = NULL;
+ entry_free( mc->mc_e );
+ }
+
+ ch_free( mc );
+}
+
+int
+monitor_cache_destroy(
+ monitor_info_t *mi )
+{
+ if ( mi->mi_cache ) {
+ avl_free( mi->mi_cache, monitor_entry_destroy );
+ }
+
+ return 0;
+}
+