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 a246eee9950eaf9436801abe4f1bed55bc09ad80..48bef78a4e5de07f6b3e9972605a388604129c5e 100644 (file)
@@ -831,7 +831,7 @@ static void wait_for_root(void) {
     info("waiting for root user to be created...");
     sleep(1);
   }
     info("waiting for root user to be created...");
     sleep(1);
   }
-  trackdb_deinit();
+  trackdb_deinit(NULL);
 }
 
 int main(int argc, char **argv) {
 }
 
 int main(int argc, char **argv) {
index d724472203034ddd1c6a0b96df1dd762bab309e9..c82bf10d44ab6c5cd2d382020c9eb8e7d2d5e152 100644 (file)
@@ -325,7 +325,7 @@ void trackdb_master(ev_source *ev) {
 }
 
 /* close environment */
 }
 
 /* close environment */
-void trackdb_deinit(void) {
+void trackdb_deinit(ev_source *ev) {
   int err;
 
   /* sanity checks */
   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)
       ;
     /* 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 */
 
   }
 
   /* 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"));
 }
 
   D(("deinitialized database environment"));
 }
index 6b866516f6d135dcd2209c1b7d74e4375f72a5ef..901a74a2b66aacf8c6cec1ba7c20b68d93f70efb 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);
 #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);
 /* close/close environment */
 
 void trackdb_master(struct ev_source *ev);
index 733b3ca6bc5ddfa151b23cafa8dd1b4e03511703..7347fb18fd3868c05a38f5b03137aa62b5993771 100644 (file)
@@ -301,7 +301,7 @@ int main(int argc, char **argv) {
   }
   trackdb_commit_transaction(global_tid);
   trackdb_close();
   }
   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");
   D(("ntracks=%ld total_weight=%lld", ntracks, total_weight));
   if(!total_weight)
     fatal(0, "no tracks match random choice criteria");
index 1cee3660946fea73844d8ee2e1c3f0b1c27a606e..3a38352b2c048ef6d9067416793b7af8a65e3533 100644 (file)
@@ -423,7 +423,7 @@ int main(int argc, char **argv) {
     do_recompute(remove_pathless);
   }
   trackdb_close();
     do_recompute(remove_pathless);
   }
   trackdb_close();
-  trackdb_deinit();
+  trackdb_deinit(NULL);
   return 0;
 }
 
   return 0;
 }
 
index dfe855a4afb6b0684153dc13cb3e56134f5db4ab..f3e93f1c66db2d813577c31fd21a5517c9a5c556 100644 (file)
@@ -409,7 +409,7 @@ int main(int argc, char **argv) {
         do_directory(argv[n], recheck_collection);
   }
   trackdb_close();
         do_directory(argv[n], recheck_collection);
   }
   trackdb_close();
-  trackdb_deinit();
+  trackdb_deinit(NULL);
   info("completed");
   return 0;
 }
   info("completed");
   return 0;
 }
index 47bb75c57624d68ec2b69c6790bd27b374c87682..bb36ee44f2d13d99919986c1dc8cb59fda2cf99e 100644 (file)
@@ -49,7 +49,7 @@ void quit(ev_source *ev) {
   info("shutting down...");
   quitting(ev);
   trackdb_close();
   info("shutting down...");
   quitting(ev);
   trackdb_close();
-  trackdb_deinit();
+  trackdb_deinit(ev);
   /* Shutdown subprocesses.
    *
    * Subprocesses that use ev_child:
   /* Shutdown subprocesses.
    *
    * Subprocesses that use ev_child: