summaryrefslogtreecommitdiff
path: root/main/db.c
diff options
context:
space:
mode:
authorMark Michelson <mmichelson@digium.com>2014-03-14 16:19:21 +0000
committerMark Michelson <mmichelson@digium.com>2014-03-14 16:19:21 +0000
commitc1e9d2f177cb85048822037d4cdba9622501023a (patch)
treea70009d6103595e8a766059f3f9e925490713ca9 /main/db.c
parent4c2b1c225bd9433247c8ef192bde4312d174a4b8 (diff)
Prevent delayed astdb syncs.
The syncing thread sleeps for a second before waiting to be told to attempt to sync again. If a signal were sent during this sleeping period, we would end up having to wait until the next sync signal occurred in order to sync up the astdb. This code rearrangement also ensures that any pending transactions will be synced prior to Asterisk shutting down. Patches: db_sync.patch by John Hardin (License #6512) ........ Merged revisions 410556 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 410559 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@410567 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/db.c')
-rw-r--r--main/db.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/main/db.c b/main/db.c
index df3398ab2..011fe26e4 100644
--- a/main/db.c
+++ b/main/db.c
@@ -112,6 +112,7 @@ static ast_cond_t dbcond;
static sqlite3 *astdb;
static pthread_t syncthread;
static int doexit;
+static int dosync;
static void db_sync(void);
@@ -939,6 +940,7 @@ static int manager_dbdeltree(struct mansession *s, const struct message *m)
*/
static void db_sync(void)
{
+ dosync = 1;
ast_cond_signal(&dbcond);
}
@@ -957,6 +959,14 @@ static void *db_sync_thread(void *data)
ast_mutex_lock(&dblock);
ast_db_begin_transaction();
for (;;) {
+ /* If dosync is set, db_sync() was called during sleep(1),
+ * and the pending transaction should be committed.
+ * Otherwise, block until db_sync() is called.
+ */
+ while (!dosync) {
+ ast_cond_wait(&dbcond, &dblock);
+ }
+ dosync = 0;
/* We're ok with spurious wakeups, so we don't worry about a predicate */
ast_cond_wait(&dbcond, &dblock);
if (ast_db_commit_transaction()) {
@@ -970,15 +980,6 @@ static void *db_sync_thread(void *data)
ast_mutex_unlock(&dblock);
sleep(1);
ast_mutex_lock(&dblock);
- /* Unfortunately, it is possible for signaling to happen
- * when we're not waiting: in the bit when we're unlocked
- * above. Do the do-exit check here again. (We could do
- * it once, but that would impose a forced delay of 1
- * second always.) */
- if (doexit) {
- ast_mutex_unlock(&dblock);
- break;
- }
}
return NULL;
@@ -998,8 +999,8 @@ static void astdb_atexit(void)
/* Set doexit to 1 to kill thread. db_sync must be called with
* mutex held. */
- doexit = 1;
ast_mutex_lock(&dblock);
+ doexit = 1;
db_sync();
ast_mutex_unlock(&dblock);