From: Hallvard Furuseth Date: Tue, 6 Apr 1999 01:55:11 +0000 (+0000) Subject: ifdef SLAP_CLEANUP: close db files, free memory, some other cleanup before exit X-Git-Tag: OPENLDAP_SLAPD_BACK_LDAP~240 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=d9d11a315f9730ee3f6cad81da2508898ee3fc56;p=openldap ifdef SLAP_CLEANUP: close db files, free memory, some other cleanup before exit --- diff --git a/libraries/libldap_r/rdwr.c b/libraries/libldap_r/rdwr.c index 39fd9f7a9a..34b2253cd6 100644 --- a/libraries/libldap_r/rdwr.c +++ b/libraries/libldap_r/rdwr.c @@ -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 ); diff --git a/servers/slapd/back-ldbm/attr.c b/servers/slapd/back-ldbm/attr.c index 07bbcfdb6e..a5ece146fb 100644 --- a/servers/slapd/back-ldbm/attr.c +++ b/servers/slapd/back-ldbm/attr.c @@ -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 */ diff --git a/servers/slapd/back-ldbm/cache.c b/servers/slapd/back-ldbm/cache.c index 5386735fcc..bbb9dd15eb 100644 --- a/servers/slapd/back-ldbm/cache.c +++ b/servers/slapd/back-ldbm/cache.c @@ -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 diff --git a/servers/slapd/back-ldbm/close.c b/servers/slapd/back-ldbm/close.c index 5cb9a75b1c..9e520485d7 100644 --- a/servers/slapd/back-ldbm/close.c +++ b/servers/slapd/back-ldbm/close.c @@ -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; } diff --git a/servers/slapd/back-ldbm/dbcache.c b/servers/slapd/back-ldbm/dbcache.c index 58b7b8571d..b068612fe3 100644 --- a/servers/slapd/back-ldbm/dbcache.c +++ b/servers/slapd/back-ldbm/dbcache.c @@ -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 ); diff --git a/servers/slapd/back-ldbm/init.c b/servers/slapd/back-ldbm/init.c index b3c2845fa9..4ca59cf035 100644 --- a/servers/slapd/back-ldbm/init.c +++ b/servers/slapd/back-ldbm/init.c @@ -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; diff --git a/servers/slapd/back-ldbm/proto-back-ldbm.h b/servers/slapd/back-ldbm/proto-back-ldbm.h index 61fc54074d..e64c6a4065 100644 --- a/servers/slapd/back-ldbm/proto-back-ldbm.h +++ b/servers/slapd/back-ldbm/proto-back-ldbm.h @@ -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 diff --git a/servers/slapd/main.c b/servers/slapd/main.c index a3cbae3b2d..4eee5962d0 100644 --- a/servers/slapd/main.c +++ b/servers/slapd/main.c @@ -321,6 +321,10 @@ destroy: Debug( LDAP_DEBUG_ANY, "slapd stopped.\n", 0, 0, 0 ); +#ifdef SLAP_CLEANUP + closelog(); +#endif + return rc; } diff --git a/servers/slapd/tools/ldif2id2children-bdb2.c b/servers/slapd/tools/ldif2id2children-bdb2.c index 1d3e01be20..5b85054461 100644 --- a/servers/slapd/tools/ldif2id2children-bdb2.c +++ b/servers/slapd/tools/ldif2id2children-bdb2.c @@ -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(); diff --git a/servers/slapd/tools/ldif2id2children.c b/servers/slapd/tools/ldif2id2children.c index 16418a8d34..4225786c63 100644 --- a/servers/slapd/tools/ldif2id2children.c +++ b/servers/slapd/tools/ldif2id2children.c @@ -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(); diff --git a/servers/slapd/tools/ldif2id2entry-bdb2.c b/servers/slapd/tools/ldif2id2entry-bdb2.c index b46cf26e8b..b3769b3d4e 100644 --- a/servers/slapd/tools/ldif2id2entry-bdb2.c +++ b/servers/slapd/tools/ldif2id2entry-bdb2.c @@ -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(); diff --git a/servers/slapd/tools/ldif2id2entry.c b/servers/slapd/tools/ldif2id2entry.c index 7dbf064f47..6e97fbe55c 100644 --- a/servers/slapd/tools/ldif2id2entry.c +++ b/servers/slapd/tools/ldif2id2entry.c @@ -182,6 +182,10 @@ main( int argc, char **argv ) } } +#ifdef SLAP_CLEANUP + ldbm_cache_close( be, db ); +#endif + slap_shutdown(dbnum); id++;