chiark / gitweb /
Cleaner subprocess shutdow in trackdb_deinit().
authorRichard Kettlewell <rjk@greenend.org.uk>
Sun, 25 Oct 2009 14:38:26 +0000 (14:38 +0000)
committerRichard Kettlewell <rjk@greenend.org.uk>
Sun, 25 Oct 2009 14:38:26 +0000 (14:38 +0000)
clients/disorder.c
lib/trackdb.c
lib/trackdb.h
server/choose.c
server/dump.c
server/rescan.c
server/state.c

index a246eee..48bef78 100644 (file)
@@ -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) {
index d724472..c82bf10 100644 (file)
@@ -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"));
 }
index 6b86651..901a74a 100644 (file)
@@ -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);
index 733b3ca..7347fb1 100644 (file)
@@ -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");
index 1cee366..3a38352 100644 (file)
@@ -423,7 +423,7 @@ int main(int argc, char **argv) {
     do_recompute(remove_pathless);
   }
   trackdb_close();
-  trackdb_deinit();
+  trackdb_deinit(NULL);
   return 0;
 }
 
index dfe855a..f3e93f1 100644 (file)
@@ -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;
 }
index 47bb75c..bb36ee4 100644 (file)
@@ -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: