From: Richard Kettlewell Date: Sun, 25 Oct 2009 14:38:26 +0000 (+0000) Subject: Cleaner subprocess shutdow in trackdb_deinit(). X-Git-Tag: 5.0~81 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/commitdiff_plain/8cd7d4bca92b0db48af0db692b3394ffdb789025 Cleaner subprocess shutdow in trackdb_deinit(). --- diff --git a/clients/disorder.c b/clients/disorder.c index a246eee..48bef78 100644 --- a/clients/disorder.c +++ b/clients/disorder.c @@ -831,7 +831,7 @@ static void wait_for_root(void) { info("waiting for root user to be created..."); sleep(1); } - trackdb_deinit(); + trackdb_deinit(NULL); } int main(int argc, char **argv) { diff --git a/lib/trackdb.c b/lib/trackdb.c index d724472..c82bf10 100644 --- a/lib/trackdb.c +++ b/lib/trackdb.c @@ -325,7 +325,7 @@ void trackdb_master(ev_source *ev) { } /* close environment */ -void trackdb_deinit(void) { +void trackdb_deinit(ev_source *ev) { int err; /* sanity checks */ @@ -343,14 +343,23 @@ void trackdb_deinit(void) { /* wait for the rescanner to finish */ while(waitpid(rescan_pid, &err, 0) == -1 && errno == EINTR) ; + if(ev) + ev_child_cancel(ev, rescan_pid); + rescan_pid = -1; } /* TODO kill any stats subprocesses */ - /* finally terminate the deadlock manager */ - if(db_deadlock_pid != -1 && kill(db_deadlock_pid, SIGTERM) < 0) - fatal(errno, "error killing deadlock manager"); - db_deadlock_pid = -1; + if(db_deadlock_pid != -1) { + /* shut down the deadlock manager */ + if(kill(db_deadlock_pid, SIGTERM) < 0) + fatal(errno, "error killing deadlock manager"); + while(waitpid(db_deadlock_pid, &err, 0) == -1 && errno == EINTR) + ; + if(ev) + ev_child_cancel(ev, db_deadlock_pid); + db_deadlock_pid = -1; + } D(("deinitialized database environment")); } diff --git a/lib/trackdb.h b/lib/trackdb.h index 6b86651..901a74a 100644 --- a/lib/trackdb.h +++ b/lib/trackdb.h @@ -61,7 +61,7 @@ extern unsigned long cache_files_hits, cache_files_misses; #define TRACKDB_READ_ONLY 0x0020 void trackdb_init(int flags); -void trackdb_deinit(void); +void trackdb_deinit(ev_source *ev); /* close/close environment */ void trackdb_master(struct ev_source *ev); diff --git a/server/choose.c b/server/choose.c index 733b3ca..7347fb1 100644 --- a/server/choose.c +++ b/server/choose.c @@ -301,7 +301,7 @@ int main(int argc, char **argv) { } trackdb_commit_transaction(global_tid); trackdb_close(); - trackdb_deinit(); + trackdb_deinit(NULL); D(("ntracks=%ld total_weight=%lld", ntracks, total_weight)); if(!total_weight) fatal(0, "no tracks match random choice criteria"); diff --git a/server/dump.c b/server/dump.c index 1cee366..3a38352 100644 --- a/server/dump.c +++ b/server/dump.c @@ -423,7 +423,7 @@ int main(int argc, char **argv) { do_recompute(remove_pathless); } trackdb_close(); - trackdb_deinit(); + trackdb_deinit(NULL); return 0; } diff --git a/server/rescan.c b/server/rescan.c index dfe855a..f3e93f1 100644 --- a/server/rescan.c +++ b/server/rescan.c @@ -409,7 +409,7 @@ int main(int argc, char **argv) { do_directory(argv[n], recheck_collection); } trackdb_close(); - trackdb_deinit(); + trackdb_deinit(NULL); info("completed"); return 0; } diff --git a/server/state.c b/server/state.c index 47bb75c..bb36ee4 100644 --- a/server/state.c +++ b/server/state.c @@ -49,7 +49,7 @@ void quit(ev_source *ev) { info("shutting down..."); quitting(ev); trackdb_close(); - trackdb_deinit(); + trackdb_deinit(ev); /* Shutdown subprocesses. * * Subprocesses that use ev_child: