ifdef SLAP_CLEANUP: close db files, free memory, some other cleanup before exit

This commit is contained in:
Hallvard Furuseth 1999-04-06 01:55:11 +00:00
parent e78f4140d7
commit d9d11a315f
12 changed files with 116 additions and 0 deletions

View File

@ -60,6 +60,9 @@ ldap_pvt_thread_rdwr_destroy( ldap_pvt_thread_rdwr_t *rw )
rw->ltrw_valid = 0;
#ifdef SLAP_CLEANUP
ldap_pvt_thread_mutex_unlock( &rw->ltrw_mutex );
#endif
ldap_pvt_thread_mutex_destroy( &rw->ltrw_mutex );
ldap_pvt_thread_cond_destroy( &rw->ltrw_read );
ldap_pvt_thread_cond_destroy( &rw->ltrw_write );

View File

@ -166,3 +166,22 @@ attr_index_config(
if ( argc > 1 )
charray_free( indexes );
}
#ifdef SLAP_CLEANUP
static void
ainfo_free( void *attr )
{
struct attrinfo *ai = attr;
free( ai->ai_type );
free( ai );
}
void
attr_index_destroy( Avlnode *tree )
{
avl_free( tree, ainfo_free );
}
#endif /* SLAP_CLEANUP */

View File

@ -640,6 +640,39 @@ cache_delete_entry_internal(
return( 0 );
}
#ifdef SLAP_CLEANUP
void
cache_release_all( struct cache *cache )
{
Entry *e;
int rc;
/* set cache mutex */
ldap_pvt_thread_mutex_lock( &cache->c_mutex );
Debug( LDAP_DEBUG_TRACE, "====> cache_release_all\n", 0, 0, 0 );
while ( (e = cache->c_lrutail) != NULL && LEI(e)->lei_refcnt == 0 ) {
#ifdef LDAP_DEBUG
assert(!ldap_pvt_thread_rdwr_active(&LEI(e)->lei_rdwr));
#endif
/* delete from cache and lru q */
/* XXX do we need rc ? */
rc = cache_delete_entry_internal( cache, e );
cache_entry_private_destroy( e );
entry_free( e );
}
if ( cache->c_cursize )
Debug( LDAP_DEBUG_TRACE, "Entry-cache could not be emptied\n", 0, 0, 0 );
/* free cache mutex */
ldap_pvt_thread_mutex_unlock( &cache->c_mutex );
}
#endif /* SLAP_CLEANUP */
#ifdef LDAP_DEBUG
static void

View File

@ -21,5 +21,9 @@ ldbm_back_db_close( Backend *be )
ldbm_cache_flush_all( be );
Debug( LDAP_DEBUG_TRACE, "ldbm backend done syncing\n", 0, 0, 0 );
#ifdef SLAP_CLEANUP
cache_release_all( &((struct ldbminfo *) be->be_private)->li_cache );
#endif
return 0;
}

View File

@ -163,6 +163,22 @@ ldbm_cache_flush_all( Backend *be )
Debug( LDAP_DEBUG_TRACE, "ldbm flushing db (%s)\n",
li->li_dbcache[i].dbc_name, 0, 0 );
ldbm_sync( li->li_dbcache[i].dbc_db );
#ifdef SLAP_CLEANUP
if ( li->li_dbcache[i].dbc_refcnt != 0 ) {
Debug( LDAP_DEBUG_TRACE,
"refcnt = %d, couldn't close db (%s)\n",
li->li_dbcache[i].dbc_refcnt,
li->li_dbcache[i].dbc_name, 0 );
} else {
Debug( LDAP_DEBUG_TRACE,
"ldbm closing db (%s)\n",
li->li_dbcache[i].dbc_name, 0, 0 );
ldap_pvt_thread_cond_signal( &li->li_dbcache_cv );
ldbm_close( li->li_dbcache[i].dbc_db );
free( li->li_dbcache[i].dbc_name );
li->li_dbcache[i].dbc_name = NULL;
}
#endif /* SLAP_CLEANUP */
}
}
ldap_pvt_thread_mutex_unlock( &li->li_dbcache_mutex );

View File

@ -157,6 +157,19 @@ ldbm_back_db_destroy(
)
{
/* should free/destroy every in be_private */
#ifdef SLAP_CLEANUP
struct ldbminfo *li = (struct ldbminfo *) be->be_private;
free( li->li_nextid_file );
free( li->li_directory );
attr_index_destroy( li->li_attrs );
ldap_pvt_thread_mutex_destroy( &li->li_root_mutex );
ldap_pvt_thread_mutex_destroy( &li->li_add_mutex );
ldap_pvt_thread_mutex_destroy( &li->li_cache.c_mutex );
ldap_pvt_thread_mutex_destroy( &li->li_nextid_mutex );
ldap_pvt_thread_mutex_destroy( &li->li_dbcache_mutex );
ldap_pvt_thread_cond_destroy( &li->li_dbcache_cv );
#endif /* SLAP_CLEANUP */
free( be->be_private );
be->be_private = NULL;
return 0;

View File

@ -29,6 +29,9 @@ void attr_masks LDAP_P(( struct ldbminfo *li, char *type, int *indexmask,
int *syntaxmask ));
void attr_index_config LDAP_P(( struct ldbminfo *li, char *fname, int lineno,
int argc, char **argv, int init ));
#ifdef SLAP_CLEANUP
void attr_index_destroy LDAP_P(( Avlnode *tree ));
#endif
/*
* cache.c
@ -43,6 +46,9 @@ void cache_return_entry_rw LDAP_P(( struct cache *cache, Entry *e, int rw ));
ID cache_find_entry_dn2id LDAP_P(( Backend *be, struct cache *cache, char *dn ));
Entry * cache_find_entry_id LDAP_P(( struct cache *cache, ID id, int rw ));
int cache_delete_entry LDAP_P(( struct cache *cache, Entry *e ));
#ifdef SLAP_CLEANUP
void cache_release_all LDAP_P(( struct cache *cache ));
#endif
/*
* dbcache.c

View File

@ -321,6 +321,10 @@ destroy:
Debug( LDAP_DEBUG_ANY, "slapd stopped.\n", 0, 0, 0 );
#ifdef SLAP_CLEANUP
closelog();
#endif
return rc;
}

View File

@ -301,6 +301,11 @@ main( int argc, char **argv )
}
}
#ifdef SLAP_CLEANUP
bdb2i_cache_close( be, db2 );
bdb2i_cache_close( be, db );
#endif
slap_shutdown(dbnum);
slap_destroy();

View File

@ -301,6 +301,11 @@ main( int argc, char **argv )
}
}
#ifdef SLAP_CLEANUP
ldbm_cache_close( be, db2 );
ldbm_cache_close( be, db );
#endif
slap_shutdown(dbnum);
slap_destroy();

View File

@ -185,6 +185,10 @@ main( int argc, char **argv )
id++;
bdb2i_put_nextid( be, id );
#ifdef SLAP_CLEANUP
bdb2i_cache_close( be, db );
#endif
slap_shutdown(dbnum);
slap_destroy();

View File

@ -182,6 +182,10 @@ main( int argc, char **argv )
}
}
#ifdef SLAP_CLEANUP
ldbm_cache_close( be, db );
#endif
slap_shutdown(dbnum);
id++;