chiark / gitweb /
Cleaner subprocess shutdow in trackdb_deinit().
[disorder] / lib / trackdb.c
index 5536b73a2f7e44aebe4c4df5557a8cbe4b615fc5..c82bf10d44ab6c5cd2d382020c9eb8e7d2d5e152 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"));
 }
@@ -1051,7 +1060,7 @@ int trackdb_notice_tid(const char *track,
   /* this is a real track */
   t_changed += kvp_set(&t, "_alias_for", 0);
   t_changed += kvp_set(&t, "_path", path);
-  time(&now);
+  xtime(&now);
   if(ret == DB_NOTFOUND) {
     /* It's a new track; record the time */
     byte_xasprintf(&noticed, "%lld", (long long)now);
@@ -2609,7 +2618,7 @@ static int create_user(const char *user,
     kvp_set(&k, "email", email);
   if(confirmation)
     kvp_set(&k, "confirmation", confirmation);
-  snprintf(s, sizeof s, "%jd", (intmax_t)time(0));
+  snprintf(s, sizeof s, "%jd", (intmax_t)xtime(0));
   kvp_set(&k, "created", s);
   return trackdb_putdata(trackdb_usersdb, user, k, tid, flags);
 }