ldap_pvt_thread_mutex_t mp_mutex; /* entry mutex */
Entry *mp_next; /* pointer to next sibling */
Entry *mp_children; /* pointer to first child */
+ Entry *mp_last; /* pointer to last child */
struct monitor_subsys_t *mp_info; /* subsystem info */
#define mp_type mp_info->mss_type
unsigned long mp_flags; /* flags */
/*
* Internal data
+ *
+ * Lock order:
+ * - cache first, then entry
+ * - DIT in preorder DFS
*/
Avlnode *mi_cache;
- ldap_pvt_thread_rdwr_t mi_cache_rwlock;
+ ldap_pvt_thread_mutex_t mi_cache_lock;
/*
* Config parameters
)
{
monitor_info_t *mi;
- Entry *e_backend, **ep;
+ Entry *e_backend;
int i;
monitor_entry_t *mp;
monitor_subsys_t *ms_database;
return( -1 );
}
- mp = ( monitor_entry_t * )e_backend->e_private;
- mp->mp_children = NULL;
- ep = &mp->mp_children;
-
i = -1;
LDAP_STAILQ_FOREACH( bi, &backendInfo, bi_next ) {
char buf[ BACKMONITOR_BUFSIZE ];
mp->mp_info = ms;
mp->mp_flags = ms->mss_flags | MONITOR_F_SUB;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_backend ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_backend_init: "
"unable to add entry \"cn=Backend %d,%s\"\n",
ms->mss_ndn.bv_val );
return( -1 );
}
-
- *ep = e;
- ep = &mp->mp_next;
}
monitor_cache_release( mi, e_backend );
int
monitor_cache_add(
monitor_info_t *mi,
- Entry *e )
+ Entry *e,
+ Entry *parent )
{
- monitor_cache_t *mc;
- int rc;
+ monitor_cache_t tmp_mc, *mc, *pmc = NULL;
+ Entry **ep = NULL, *prev = NULL;
+ int rc = -1;
assert( mi != NULL );
assert( e != NULL );
+ dnParent( &e->e_nname, &tmp_mc.mc_ndn );
+
mc = ( monitor_cache_t * )ch_malloc( sizeof( monitor_cache_t ) );
mc->mc_ndn = e->e_nname;
mc->mc_e = e;
- ldap_pvt_thread_rdwr_wlock( &mi->mi_cache_rwlock );
- rc = ldap_avl_insert( &mi->mi_cache, ( caddr_t )mc,
+
+ if ( parent ) {
+ /* Shortcut, but follow lock order as a fallback */
+ if ( ldap_pvt_thread_mutex_trylock( &mi->mi_cache_lock ) ) {
+ monitor_cache_release( mi, parent );
+ ldap_pvt_thread_mutex_lock( &mi->mi_cache_lock );
+ monitor_cache_lock( parent );
+ }
+ } else {
+ ldap_pvt_thread_mutex_lock( &mi->mi_cache_lock );
+ }
+
+ /* Allow database root be added */
+ if ( parent == NULL && mi->mi_cache != NULL ) {
+ pmc = ldap_avl_find( mi->mi_cache, &tmp_mc, monitor_cache_cmp );
+ if ( pmc == NULL ) {
+ goto done;
+ }
+ parent = pmc->mc_e;
+ monitor_cache_lock( parent );
+ }
+
+ rc = ldap_avl_insert( &mi->mi_cache, mc,
monitor_cache_cmp, monitor_cache_dup );
- ldap_pvt_thread_rdwr_wunlock( &mi->mi_cache_rwlock );
+ if ( rc != LDAP_SUCCESS ) {
+ goto done;
+ }
+
+ if ( parent != NULL ) {
+ monitor_entry_t *mp = parent->e_private;
+
+ if ( mp->mp_children ) {
+ monitor_entry_t *tail;
+
+ monitor_cache_lock( mp->mp_last );
+ tail = mp->mp_last->e_private;
+ tail->mp_next = e;
+ monitor_cache_release( mi, mp->mp_last );
+ mp->mp_last = e;
+ } else {
+ mp->mp_children = mp->mp_last = e;
+ }
+ }
+
+done:
+ if ( pmc != NULL ) {
+ monitor_cache_release( mi, parent );
+ }
+ ldap_pvt_thread_mutex_unlock( &mi->mi_cache_lock );
+ if ( rc != LDAP_SUCCESS ) {
+ ch_free( mc );
+ }
return rc;
}
*ep = NULL;
tmp_mc.mc_ndn = *ndn;
-retry:;
- ldap_pvt_thread_rdwr_rlock( &mi->mi_cache_rwlock );
+
+ ldap_pvt_thread_mutex_lock( &mi->mi_cache_lock );
mc = ( monitor_cache_t * )ldap_avl_find( mi->mi_cache,
( caddr_t )&tmp_mc, monitor_cache_cmp );
if ( mc != NULL ) {
/* entry is returned with mutex locked */
- if ( monitor_cache_trylock( mc->mc_e ) ) {
- ldap_pvt_thread_rdwr_runlock( &mi->mi_cache_rwlock );
- ldap_pvt_thread_yield();
- goto retry;
- }
+ monitor_cache_lock( mc->mc_e );
*ep = mc->mc_e;
}
- ldap_pvt_thread_rdwr_runlock( &mi->mi_cache_rwlock );
+ ldap_pvt_thread_mutex_unlock( &mi->mi_cache_lock );
return ( *ep == NULL ? -1 : 0 );
}
dnParent( ndn, &pndn );
retry:;
- ldap_pvt_thread_rdwr_wlock( &mi->mi_cache_rwlock );
+ ldap_pvt_thread_mutex_lock( &mi->mi_cache_lock );
tmp_mc.mc_ndn = *ndn;
mc = ( monitor_cache_t * )ldap_avl_find( mi->mi_cache,
if ( mc != NULL ) {
monitor_cache_t *pmc;
- if ( monitor_cache_trylock( mc->mc_e ) ) {
- ldap_pvt_thread_rdwr_wunlock( &mi->mi_cache_rwlock );
- goto retry;
- }
-
tmp_mc.mc_ndn = pndn;
pmc = ( monitor_cache_t * )ldap_avl_find( mi->mi_cache,
( caddr_t )&tmp_mc, monitor_cache_cmp );
if ( pmc != NULL ) {
monitor_entry_t *mp = (monitor_entry_t *)mc->mc_e->e_private,
*pmp = (monitor_entry_t *)pmc->mc_e->e_private;
- Entry **entryp;
+ Entry **entryp, *prev = NULL;
- if ( monitor_cache_trylock( pmc->mc_e ) ) {
- monitor_cache_release( mi, mc->mc_e );
- ldap_pvt_thread_rdwr_wunlock( &mi->mi_cache_rwlock );
- goto retry;
- }
+ monitor_cache_lock( pmc->mc_e );
for ( entryp = &pmp->mp_children; *entryp != NULL; ) {
monitor_entry_t *next = (monitor_entry_t *)(*entryp)->e_private;
+
+ monitor_cache_lock( *entryp );
if ( next == mp ) {
+ if ( mc->mc_e == pmp->mp_last ) {
+ pmp->mp_last = prev;
+ }
*entryp = next->mp_next;
entryp = NULL;
break;
}
+ if ( prev != NULL ) {
+ monitor_cache_release( mi, prev );
+ }
+ prev = *entryp;
entryp = &next->mp_next;
}
+ if ( prev ) {
+ monitor_cache_release( mi, prev );
+ }
if ( entryp != NULL ) {
Debug( LDAP_DEBUG_ANY,
ldap_pvt_thread_mutex_destroy( &mp->mp_mutex );
mp->mp_next = NULL;
mp->mp_children = NULL;
+ mp->mp_last = NULL;
}
}
}
}
- ldap_pvt_thread_rdwr_wunlock( &mi->mi_cache_rwlock );
+ ldap_pvt_thread_mutex_unlock( &mi->mi_cache_lock );
return ( *ep == NULL ? -1 : 0 );
}
monitor_subsys_t *ms )
{
monitor_info_t *mi;
- Entry *e, **ep, *e_conn;
+ Entry *e, *e_conn;
monitor_entry_t *mp;
char buf[ BACKMONITOR_BUFSIZE ];
struct berval bv;
}
mp = ( monitor_entry_t * )e_conn->e_private;
- mp->mp_children = NULL;
- ep = &mp->mp_children;
/*
* Max file descriptors
| MONITOR_F_SUB | MONITOR_F_PERSISTENT;
mp->mp_flags &= ~MONITOR_F_VOLATILE_CH;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_conn ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_conn_init: "
"unable to add entry \"cn=Total,%s\"\n",
return( -1 );
}
- *ep = e;
- ep = &mp->mp_next;
-
/*
* Total conns
*/
| MONITOR_F_SUB | MONITOR_F_PERSISTENT;
mp->mp_flags &= ~MONITOR_F_VOLATILE_CH;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_conn ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_conn_init: "
"unable to add entry \"cn=Total,%s\"\n",
return( -1 );
}
- *ep = e;
- ep = &mp->mp_next;
-
/*
* Current conns
*/
| MONITOR_F_SUB | MONITOR_F_PERSISTENT;
mp->mp_flags &= ~MONITOR_F_VOLATILE_CH;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_conn ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_conn_init: "
"unable to add entry \"cn=Current,%s\"\n",
return( -1 );
}
- *ep = e;
- ep = &mp->mp_next;
-
monitor_cache_release( mi, e_conn );
return( 0 );
mp_overlay->mp_info = ms;
mp_overlay->mp_flags = ms->mss_flags | MONITOR_F_SUB;
- if ( monitor_cache_add( mi, e_overlay ) ) {
+ if ( monitor_cache_add( mi, e_overlay, e_database ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_overlay_init_one: "
"unable to add entry "
}
*ep_overlay = e_overlay;
- ep_overlay = &mp_overlay->mp_next;
-
return 0;
}
monitor_subsys_t *ms_overlay,
struct berval *rdn,
Entry *e_database,
- Entry ***epp )
+ struct slap_overinst *overlay,
+ Entry **ep )
{
char buf[ BACKMONITOR_BUFSIZE ];
int j;
| MONITOR_F_SUB;
mp->mp_private = be;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_database ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_database_init_one: "
"unable to add entry \"%s,%s\"\n",
#endif /* defined(LDAP_SLAPI) */
if ( oi != NULL ) {
- Entry **ep_overlay = &mp->mp_children;
+ Entry *e_overlay;
slap_overinst *on = oi->oi_list;
for ( ; on; on = on->on_next ) {
monitor_subsys_overlay_init_one( mi, be,
- ms, ms_overlay, on, e, ep_overlay );
+ ms, ms_overlay, on, e, &e_overlay );
+ if ( overlay == on ) {
+ *ep = e_overlay;
+ }
}
}
-
- **epp = e;
- *epp = &mp->mp_next;
+ if ( overlay == NULL ) {
+ *ep = e;
+ }
return 0;
}
struct berval *ndn_out )
{
monitor_info_t *mi;
- Entry *e_database, **ep;
+ Entry *e_database, *e = NULL;
int i, rc;
monitor_entry_t *mp;
monitor_subsys_t *ms_backend,
return( -1 );
}
+ /* FIXME: It's only safe since we're paused */
mp = ( monitor_entry_t * )e_database->e_private;
- for ( i = -1, ep = &mp->mp_children; *ep; i++ ) {
- mp = ( monitor_entry_t * )(*ep)->e_private;
+ for ( i = -1, e = mp->mp_children; e; i++ ) {
+ mp = ( monitor_entry_t * )e->e_private;
assert( mp != NULL );
if ( mp->mp_private == be->bd_self ) {
rc = 0;
goto done;
}
- ep = &mp->mp_next;
+ e = mp->mp_next;
}
bv.bv_val = buf;
}
rc = monitor_subsys_database_init_one( mi, be,
- ms_database, ms_backend, ms_overlay, &bv, e_database, &ep );
+ ms_database, ms_backend, ms_overlay, &bv, e_database, on, &e );
if ( rc != 0 ) {
goto done;
}
- /* database_init_one advanced ep past where we want.
- * But it stored the entry we want in mp->mp_next.
- */
- ep = &mp->mp_next;
done:;
monitor_cache_release( mi, e_database );
- if ( rc == 0 && ndn_out && ep && *ep ) {
- if ( on ) {
- Entry *e_ov;
- struct berval ov_type;
-
- ber_str2bv( on->on_bi.bi_type, 0, 0, &ov_type );
-
- mp = ( monitor_entry_t * ) (*ep)->e_private;
- for ( e_ov = mp->mp_children; e_ov; ) {
- Attribute *a = attr_find( e_ov->e_attrs, mi->mi_ad_monitoredInfo );
-
- if ( a != NULL && bvmatch( &a->a_nvals[ 0 ], &ov_type ) ) {
- *ndn_out = e_ov->e_nname;
- break;
- }
-
- mp = ( monitor_entry_t * ) e_ov->e_private;
- e_ov = mp->mp_next;
- }
-
- } else {
- *ndn_out = (*ep)->e_nname;
- }
+ if ( rc == 0 && ndn_out && e ) {
+ *ndn_out = e->e_nname;
}
return rc;
monitor_subsys_t *ms )
{
monitor_info_t *mi;
- Entry *e_database, **ep;
+ Entry *e_database, *e;
int i, rc;
- monitor_entry_t *mp;
monitor_subsys_t *ms_backend,
*ms_overlay;
struct berval bv;
(void)init_readOnly( mi, e_database, frontendDB->be_restrictops );
(void)init_restrictedOperation( mi, e_database, frontendDB->be_restrictops );
- mp = ( monitor_entry_t * )e_database->e_private;
- mp->mp_children = NULL;
- ep = &mp->mp_children;
-
BER_BVSTR( &bv, "cn=Frontend" );
rc = monitor_subsys_database_init_one( mi, frontendDB,
- ms, ms_backend, ms_overlay, &bv, e_database, &ep );
+ ms, ms_backend, ms_overlay, &bv, e_database, NULL, &e );
if ( rc != 0 ) {
return rc;
}
}
rc = monitor_subsys_database_init_one( mi, be,
- ms, ms_backend, ms_overlay, &bv, e_database, &ep );
+ ms, ms_backend, ms_overlay, &bv, e_database, NULL, &e );
if ( rc != 0 ) {
return rc;
}
assert( e->e_private == NULL );
if ( monitor_subsys_is_opened() ) {
- Entry *e_parent = NULL,
- *e_new = NULL,
- **ep = NULL;
+ Entry *e_parent = NULL, *e_new = NULL;
struct berval pdn = BER_BVNULL;
monitor_entry_t *mp = NULL,
*mp_parent = NULL;
}
mp->mp_cb = cb;
- ep = &mp_parent->mp_children;
- for ( ; *ep; ) {
- mp_parent = ( monitor_entry_t * )(*ep)->e_private;
- ep = &mp_parent->mp_next;
- }
- *ep = e_new;
-
- if ( monitor_cache_add( mi, e_new ) ) {
+ if ( monitor_cache_add( mi, e_new, e_parent ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_back_register_entry(\"%s\"): "
"unable to add entry\n",
}
if ( monitor_subsys_is_opened() ) {
- Entry *e_parent = NULL,
- *e_new = NULL,
- **ep = NULL;
+ Entry *e_parent = NULL, *e_new = NULL;
struct berval e_name = BER_BVNULL,
e_nname = BER_BVNULL;
monitor_entry_t *mp = NULL,
}
mp->mp_cb = cb;
- ep = &mp_parent->mp_children;
- for ( ; *ep; ) {
- mp_parent = ( monitor_entry_t * )(*ep)->e_private;
- ep = &mp_parent->mp_next;
- }
- *ep = e_new;
-
- if ( monitor_cache_add( mi, e_new ) ) {
+ if ( monitor_cache_add( mi, e_new, e_parent ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_back_register_entry(\"%s\"): "
"unable to add entry\n",
/* NOTE: only one monitor database is allowed,
* so we use static storage */
- ldap_pvt_thread_rdwr_init( &monitor_info.mi_cache_rwlock );
+ ldap_pvt_thread_mutex_init( &monitor_info.mi_cache_lock );
be->be_private = &monitor_info;
{
monitor_info_t *mi = (monitor_info_t *)be->be_private;
struct monitor_subsys_t **ms;
- Entry *e, **ep, *root;
+ Entry *e, *root;
monitor_entry_t *mp;
int i;
struct berval bv, rdn = BER_BVC(SLAPD_MONITOR_DN);
return -1;
}
e->e_private = ( void * )mp;
- ep = &mp->mp_children;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, NULL ) ) {
Debug( LDAP_DEBUG_ANY,
"unable to add entry \"%s\" to cache\n",
SLAPD_MONITOR_DN );
mp->mp_info = monitor_subsys[ i ];
mp->mp_flags = monitor_subsys[ i ]->mss_flags;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, root ) ) {
Debug( LDAP_DEBUG_ANY,
"unable to add entry \"%s\" to cache\n",
monitor_subsys[ i ]->mss_dn.bv_val );
return -1;
}
-
- *ep = e;
- ep = &mp->mp_next;
}
assert( be != NULL );
}
}
- ldap_pvt_thread_rdwr_destroy( &monitor_info.mi_cache_rwlock );
+ ldap_pvt_thread_mutex_destroy( &monitor_info.mi_cache_lock );
be->be_private = NULL;
)
{
monitor_info_t *mi;
- Entry *e_listener, **ep;
+ Entry *e_listener;
int i;
monitor_entry_t *mp;
Listener **l;
return( -1 );
}
- mp = ( monitor_entry_t * )e_listener->e_private;
- mp->mp_children = NULL;
- ep = &mp->mp_children;
-
for ( i = 0; l[ i ]; i++ ) {
char buf[ BACKMONITOR_BUFSIZE ];
Entry *e;
mp->mp_flags = ms->mss_flags
| MONITOR_F_SUB;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_listener ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_listener_init: "
"unable to add entry \"cn=Listener %d,%s\"\n",
i, ms->mss_ndn.bv_val );
return( -1 );
}
-
- *ep = e;
- ep = &mp->mp_next;
}
monitor_cache_release( mi, e_listener );
{
monitor_info_t *mi;
- Entry *e_op, **ep;
+ Entry *e_op;
monitor_entry_t *mp;
int i;
struct berval bv_zero = BER_BVC( "0" );
attr_merge_one( e_op, mi->mi_ad_monitorOpInitiated, &bv_zero, NULL );
attr_merge_one( e_op, mi->mi_ad_monitorOpCompleted, &bv_zero, NULL );
- mp = ( monitor_entry_t * )e_op->e_private;
- mp->mp_children = NULL;
- ep = &mp->mp_children;
-
for ( i = 0; i < SLAP_OP_LAST; i++ ) {
struct berval rdn;
Entry *e;
mp->mp_flags = ms->mss_flags \
| MONITOR_F_SUB | MONITOR_F_PERSISTENT;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_op ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_ops_init: "
"unable to add entry \"%s,%s\"\n",
ms->mss_ndn.bv_val );
return( -1 );
}
-
- *ep = e;
- ep = &mp->mp_next;
}
monitor_cache_release( mi, e_op );
)
{
monitor_info_t *mi;
- Entry *e_overlay, **ep;
+ Entry *e_overlay;
int i;
monitor_entry_t *mp;
slap_overinst *on;
return( -1 );
}
- mp = ( monitor_entry_t * )e_overlay->e_private;
- mp->mp_children = NULL;
- ep = &mp->mp_children;
-
for ( on = overlay_next( NULL ), i = 0; on; on = overlay_next( on ), i++ ) {
char buf[ BACKMONITOR_BUFSIZE ];
struct berval bv;
mp->mp_flags = ms->mss_flags
| MONITOR_F_SUB;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_overlay ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_overlay_init: "
"unable to add entry \"cn=Overlay %d,%s\"\n",
i, ms->mss_ndn.bv_val );
return( -1 );
}
-
- *ep = e;
- ep = &mp->mp_next;
}
monitor_cache_release( mi, e_overlay );
extern int
monitor_cache_add LDAP_P((
monitor_info_t *mi,
- Entry *e ));
+ Entry *e,
+ Entry *parent ));
extern int
monitor_cache_get LDAP_P((
monitor_info_t *mi,
{
monitor_info_t *mi;
- Entry **ep, *e_conn;
+ Entry *e_conn;
monitor_entry_t *mp;
int i;
return( -1 );
}
- mp = ( monitor_entry_t * )e_conn->e_private;
- mp->mp_children = NULL;
- ep = &mp->mp_children;
-
for ( i = 0; i < MONITOR_RWW_LAST; i++ ) {
struct berval nrdn, bv;
Entry *e;
mp->mp_flags = ms->mss_flags \
| MONITOR_F_SUB | MONITOR_F_PERSISTENT;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_conn ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_rww_init: "
"unable to add entry \"%s,%s\"\n",
ms->mss_ndn.bv_val );
return( -1 );
}
-
- *ep = e;
- ep = &mp->mp_next;
}
monitor_cache_release( mi, e_conn );
rc = test_filter( op, e, op->oq_search.rs_filter );
if ( rc == LDAP_COMPARE_TRUE ) {
rs->sr_entry = e;
- rs->sr_flags = REP_ENTRY_MUSTRELEASE;
rc = send_search_entry( op, rs );
if ( rc ) {
for ( e = sub_ch; e != NULL; e = sub_nv ) {
}
goto freeout;
}
- } else {
+ }
+ if ( sub_nv == NULL ) {
monitor_cache_release( mi, e );
}
rc = monitor_send_children( op, rs, sub_nv, sub_ch, sub );
if ( rc ) {
freeout:
+ monitor_cache_release( mi, e );
if ( nonvolatile == 0 ) {
for ( ; e_tmp != NULL; ) {
mp = ( monitor_entry_t * )e_tmp->e_private;
return( rc );
}
}
+ if ( sub_nv != NULL ) {
+ monitor_cache_release( mi, e );
+ }
}
return LDAP_SUCCESS;
return rs->sr_err;
}
- /* Freeze the cache while we're using it */
- ldap_pvt_thread_rdwr_rlock( &mi->mi_cache_rwlock );
-
rs->sr_attrs = op->oq_search.rs_attrs;
switch ( op->oq_search.rs_scope ) {
case LDAP_SCOPE_BASE:
case LDAP_SCOPE_ONELEVEL:
case LDAP_SCOPE_SUBORDINATE:
monitor_find_children( op, rs, e, &e_nv, &e_ch );
- monitor_cache_release( mi, e );
rc = monitor_send_children( op, rs, e_nv, e_ch,
op->oq_search.rs_scope == LDAP_SCOPE_SUBORDINATE );
+ monitor_cache_release( mi, e );
break;
case LDAP_SCOPE_SUBTREE:
rc = test_filter( op, e, op->oq_search.rs_filter );
if ( rc == LDAP_COMPARE_TRUE ) {
rs->sr_entry = e;
- rs->sr_flags = REP_ENTRY_MUSTRELEASE;
send_search_entry( op, rs );
rs->sr_entry = NULL;
- } else {
- monitor_cache_release( mi, e );
}
rc = monitor_send_children( op, rs, e_nv, e_ch, 1 );
+ monitor_cache_release( mi, e );
break;
default:
monitor_cache_release( mi, e );
}
- ldap_pvt_thread_rdwr_runlock( &mi->mi_cache_rwlock );
-
rs->sr_attrs = NULL;
rs->sr_err = rc;
if ( rs->sr_err != SLAPD_ABANDON ) {
{
monitor_info_t *mi;
- Entry **ep, *e_sent;
+ Entry *e_sent;
monitor_entry_t *mp;
int i;
return( -1 );
}
- mp = ( monitor_entry_t * )e_sent->e_private;
- mp->mp_children = NULL;
- ep = &mp->mp_children;
-
for ( i = 0; i < MONITOR_SENT_LAST; i++ ) {
struct berval nrdn, bv;
Entry *e;
mp->mp_flags = ms->mss_flags \
| MONITOR_F_SUB | MONITOR_F_PERSISTENT;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_sent ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_sent_init: "
"unable to add entry \"%s,%s\"\n",
ms->mss_ndn.bv_val );
return( -1 );
}
-
- *ep = e;
- ep = &mp->mp_next;
}
monitor_cache_release( mi, e_sent );
{
monitor_info_t *mi;
monitor_entry_t *mp;
- Entry *e, **ep, *e_thread;
+ Entry *e, *e_thread;
int i;
ms->mss_update = monitor_subsys_thread_update;
return( -1 );
}
- mp = ( monitor_entry_t * )e_thread->e_private;
- mp->mp_children = NULL;
- ep = &mp->mp_children;
-
for ( i = 0; !BER_BVISNULL( &mt[ i ].rdn ); i++ ) {
static char buf[ BACKMONITOR_BUFSIZE ];
int count = -1;
mp->mp_flags = ms->mss_flags \
| MONITOR_F_SUB | MONITOR_F_PERSISTENT;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_thread ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_thread_init: "
"unable to add entry \"%s,%s\"\n",
ms->mss_dn.bv_val );
return( -1 );
}
-
- *ep = e;
- ep = &mp->mp_next;
}
monitor_cache_release( mi, e_thread );
{
monitor_info_t *mi;
- Entry *e, **ep, *e_time;
+ Entry *e, *e_time;
monitor_entry_t *mp;
struct berval bv, value;
return( -1 );
}
- mp = ( monitor_entry_t * )e_time->e_private;
- mp->mp_children = NULL;
- ep = &mp->mp_children;
-
BER_BVSTR( &bv, "cn=Start" );
e = monitor_entry_stub( &ms->mss_dn, &ms->mss_ndn, &bv,
mi->mi_oc_monitoredObject, NULL, NULL );
mp->mp_flags = ms->mss_flags \
| MONITOR_F_SUB | MONITOR_F_PERSISTENT;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_time ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_time_init: "
"unable to add entry \"%s,%s\"\n",
return( -1 );
}
- *ep = e;
- ep = &mp->mp_next;
-
/*
* Current
*/
mp->mp_flags = ms->mss_flags \
| MONITOR_F_SUB | MONITOR_F_PERSISTENT;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_time ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_time_init: "
"unable to add entry \"%s,%s\"\n",
return( -1 );
}
- *ep = e;
- ep = &mp->mp_next;
-
/*
* Uptime
*/
mp->mp_flags = ms->mss_flags \
| MONITOR_F_SUB | MONITOR_F_PERSISTENT;
- if ( monitor_cache_add( mi, e ) ) {
+ if ( monitor_cache_add( mi, e, e_time ) ) {
Debug( LDAP_DEBUG_ANY,
"monitor_subsys_time_init: "
"unable to add entry \"%s,%s\"\n",
return( -1 );
}
- *ep = e;
- ep = &mp->mp_next;
-
monitor_cache_release( mi, e_time );
return( 0 );