X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/9c722791325f1781c26f7c01888d5e5933a20e78..0590cedca75c01811972b2f694f60f24028ee973:/lib/trackdb.c?ds=sidebyside diff --git a/lib/trackdb.c b/lib/trackdb.c index f5d5836..8945ec3 100644 --- a/lib/trackdb.c +++ b/lib/trackdb.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder - * Copyright (C) 2005, 2006, 2007 Richard Kettlewell + * Copyright (C) 2005-2008 Richard Kettlewell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -318,10 +318,18 @@ void trackdb_deinit(void) { if((err = trackdb_env->close(trackdb_env, 0))) fatal(0, "trackdb_env->close: %s", db_strerror(err)); - if(rescan_pid != -1 && kill(rescan_pid, SIGTERM) < 0) - fatal(errno, "error killing rescanner"); + if(rescan_pid != -1) { + /* shut down the rescanner */ + if(kill(rescan_pid, SIGTERM) < 0) + fatal(errno, "error killing rescanner"); + /* wait for the rescanner to finish */ + while(waitpid(rescan_pid, &err, 0) == -1 && errno == EINTR) + ; + } + + /* TODO kill any stats subprocesses */ - /* terminate the deadlock manager */ + /* 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; @@ -433,6 +441,9 @@ void trackdb_open(int flags) { trackdb_existing_database = 0; } /* open the databases */ + if(!(trackdb_usersdb = open_db("users.db", + 0, DB_HASH, dbflags, 0600))) + fatal(0, "cannot open users.db"); trackdb_tracksdb = open_db("tracks.db", DB_RECNUM, DB_BTREE, dbflags, 0666); trackdb_searchdb = open_db("search.db", @@ -443,8 +454,6 @@ void trackdb_open(int flags) { trackdb_globaldb = open_db("global.db", 0, DB_HASH, dbflags, 0666); trackdb_noticeddb = open_db("noticed.db", DB_DUPSORT, DB_BTREE, dbflags, 0666); - trackdb_usersdb = open_db("users.db", - 0, DB_HASH, dbflags, 0600); if(!trackdb_existing_database) { /* Stash the database version */ char buf[32]; @@ -2158,9 +2167,9 @@ static int reap_rescan(ev_source attribute((unused)) *ev, /** @brief Initiate a rescan * @param ev Event loop or 0 to block - * @param check 1 to recheck lengths, 0 to suppress check + * @param recheck 1 to recheck lengths, 0 to suppress check */ -void trackdb_rescan(ev_source *ev, int check) { +void trackdb_rescan(ev_source *ev, int recheck) { int w; if(rescan_pid != -1) { @@ -2168,7 +2177,7 @@ void trackdb_rescan(ev_source *ev, int check) { return; } rescan_pid = subprogram(ev, -1, RESCAN, - check ? "--check" : "--no-check", + recheck ? "--check" : "--no-check", (char *)0); if(ev) { ev_child(ev, rescan_pid, 0, reap_rescan, 0);