From 46e642e9902a6361eb0eb6208f682bf97765f81f Mon Sep 17 00:00:00 2001 From: Marco van Wieringen Date: Sat, 25 Jan 2014 22:27:26 +0100 Subject: [PATCH] Don't use a pthread_t as a normal simple type. Not on all platforms a pthread_t is a simple type and as such you cannot normally determine if its initialized or not. So for the allocation of the SD message channel we now use a bool that gets set when the thread is running and needs teardown. --- src/dird/backup.c | 4 ++-- src/dird/dird.c | 3 +-- src/dird/job.c | 2 +- src/dird/migrate.c | 4 ++-- src/dird/msgchan.c | 9 +++++---- src/dird/ndmp_dma.c | 8 ++++---- src/dird/restore.c | 4 ++-- src/dird/vbackup.c | 4 ++-- src/include/jcr.h | 1 + 9 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/dird/backup.c b/src/dird/backup.c index 2c2edbb3040..0242f679a22 100644 --- a/src/dird/backup.c +++ b/src/dird/backup.c @@ -735,7 +735,7 @@ void native_backup_cleanup(JCR *jcr, int TermCode) msg_type = M_ERROR; /* Generate error message */ if (jcr->store_bsock) { jcr->store_bsock->signal(BNET_TERMINATE); - if (jcr->SD_msg_chan) { + if (jcr->SD_msg_chan_started) { pthread_cancel(jcr->SD_msg_chan); } } @@ -744,7 +744,7 @@ void native_backup_cleanup(JCR *jcr, int TermCode) term_msg = _("Backup Canceled"); if (jcr->store_bsock) { jcr->store_bsock->signal(BNET_TERMINATE); - if (jcr->SD_msg_chan) { + if (jcr->SD_msg_chan_started) { pthread_cancel(jcr->SD_msg_chan); } } diff --git a/src/dird/dird.c b/src/dird/dird.c index 131867f74ba..50b6d40738e 100644 --- a/src/dird/dird.c +++ b/src/dird/dird.c @@ -162,8 +162,7 @@ PROG_COPYRIGHT * */ #if defined(HAVE_WIN32) -/* For Win32 main() is in src/win32 code ... */ -#define main BAREOSMain +#define main BareosMain #endif int main (int argc, char *argv[]) diff --git a/src/dird/job.c b/src/dird/job.c index d888923f7ed..7a14046779f 100644 --- a/src/dird/job.c +++ b/src/dird/job.c @@ -513,7 +513,7 @@ void sd_msg_thread_send_signal(JCR *jcr, int sig) { jcr->lock(); if (!jcr->sd_msg_thread_done && - jcr->SD_msg_chan && + jcr->SD_msg_chan_started && !pthread_equal(jcr->SD_msg_chan, pthread_self())) { Dmsg1(800, "Send kill to SD msg chan jid=%d\n", jcr->JobId); pthread_kill(jcr->SD_msg_chan, sig); diff --git a/src/dird/migrate.c b/src/dird/migrate.c index 20ae82fc82b..24d2071b778 100644 --- a/src/dird/migrate.c +++ b/src/dird/migrate.c @@ -1605,7 +1605,7 @@ void migration_cleanup(JCR *jcr, int TermCode) */ if (jcr->store_bsock) { jcr->store_bsock->signal(BNET_TERMINATE); - if (jcr->SD_msg_chan) { + if (jcr->SD_msg_chan_started) { pthread_cancel(jcr->SD_msg_chan); } } @@ -1615,7 +1615,7 @@ void migration_cleanup(JCR *jcr, int TermCode) */ if (mig_jcr->store_bsock) { mig_jcr->store_bsock->signal(BNET_TERMINATE); - if (mig_jcr->SD_msg_chan) { + if (mig_jcr->SD_msg_chan_started) { pthread_cancel(mig_jcr->SD_msg_chan); } } diff --git a/src/dird/msgchan.c b/src/dird/msgchan.c index fbb4954807f..36c6a2e9b87 100644 --- a/src/dird/msgchan.c +++ b/src/dird/msgchan.c @@ -354,14 +354,14 @@ bool start_storage_daemon_message_thread(JCR *jcr) jcr->inc_use_count(); /* mark in use by msg thread */ jcr->sd_msg_thread_done = false; - jcr->SD_msg_chan = 0; + jcr->SD_msg_chan_started = false; Dmsg0(100, "Start SD msg_thread.\n"); if ((status = pthread_create(&thid, NULL, msg_thread, (void *)jcr)) != 0) { berrno be; Jmsg1(jcr, M_ABORT, 0, _("Cannot create message thread: %s\n"), be.bstrerror(status)); } /* Wait for thread to start */ - while (jcr->SD_msg_chan == 0) { + while (!jcr->SD_msg_chan_started) { bmicrosleep(0, 50); if (job_canceled(jcr) || jcr->sd_msg_thread_done) { return false; @@ -378,7 +378,7 @@ extern "C" void msg_thread_cleanup(void *arg) db_end_transaction(jcr, jcr->db); /* terminate any open transaction */ jcr->lock(); jcr->sd_msg_thread_done = true; - jcr->SD_msg_chan = 0; + jcr->SD_msg_chan_started = false; jcr->unlock(); pthread_cond_broadcast(&jcr->nextrun_ready); /* wakeup any waiting threads */ pthread_cond_broadcast(&jcr->term_wait); /* wakeup any waiting threads */ @@ -406,6 +406,7 @@ extern "C" void *msg_thread(void *arg) pthread_detach(pthread_self()); set_jcr_in_tsd(jcr); jcr->SD_msg_chan = pthread_self(); + jcr->SD_msg_chan_started = true; pthread_cleanup_push(msg_thread_cleanup, arg); sd = jcr->store_bsock; @@ -480,7 +481,7 @@ void wait_for_storage_daemon_termination(JCR *jcr) pthread_cond_timedwait(&jcr->term_wait, &mutex, &timeout); V(mutex); if (jcr->is_canceled()) { - if (jcr->SD_msg_chan) { + if (jcr->SD_msg_chan_started) { jcr->store_bsock->set_timed_out(); jcr->store_bsock->set_terminated(); sd_msg_thread_send_signal(jcr, TIMEOUT_SIGNAL); diff --git a/src/dird/ndmp_dma.c b/src/dird/ndmp_dma.c index 9c3732f1d02..6c69cb02d55 100644 --- a/src/dird/ndmp_dma.c +++ b/src/dird/ndmp_dma.c @@ -2058,7 +2058,7 @@ void ndmp_backup_cleanup(JCR *jcr, int TermCode) msg_type = M_ERROR; /* Generate error message */ if (jcr->store_bsock) { jcr->store_bsock->signal(BNET_TERMINATE); - if (jcr->SD_msg_chan) { + if (jcr->SD_msg_chan_started) { pthread_cancel(jcr->SD_msg_chan); } } @@ -2067,7 +2067,7 @@ void ndmp_backup_cleanup(JCR *jcr, int TermCode) term_msg = _("Backup Canceled"); if (jcr->store_bsock) { jcr->store_bsock->signal(BNET_TERMINATE); - if (jcr->SD_msg_chan) { + if (jcr->SD_msg_chan_started) { pthread_cancel(jcr->SD_msg_chan); } } @@ -2516,7 +2516,7 @@ void ndmp_restore_cleanup(JCR *jcr, int TermCode) msg_type = M_ERROR; /* Generate error message */ if (jcr->store_bsock) { jcr->store_bsock->signal(BNET_TERMINATE); - if (jcr->SD_msg_chan) { + if (jcr->SD_msg_chan_started) { pthread_cancel(jcr->SD_msg_chan); } } @@ -2525,7 +2525,7 @@ void ndmp_restore_cleanup(JCR *jcr, int TermCode) term_msg = _("Restore Canceled"); if (jcr->store_bsock) { jcr->store_bsock->signal(BNET_TERMINATE); - if (jcr->SD_msg_chan) { + if (jcr->SD_msg_chan_started) { pthread_cancel(jcr->SD_msg_chan); } } diff --git a/src/dird/restore.c b/src/dird/restore.c index 8dff99328e2..299b3be862b 100644 --- a/src/dird/restore.c +++ b/src/dird/restore.c @@ -482,7 +482,7 @@ void native_restore_cleanup(JCR *jcr, int TermCode) msg_type = M_ERROR; /* Generate error message */ if (jcr->store_bsock) { jcr->store_bsock->signal(BNET_TERMINATE); - if (jcr->SD_msg_chan) { + if (jcr->SD_msg_chan_started) { pthread_cancel(jcr->SD_msg_chan); } } @@ -491,7 +491,7 @@ void native_restore_cleanup(JCR *jcr, int TermCode) term_msg = _("Restore Canceled"); if (jcr->store_bsock) { jcr->store_bsock->signal(BNET_TERMINATE); - if (jcr->SD_msg_chan) { + if (jcr->SD_msg_chan_started) { pthread_cancel(jcr->SD_msg_chan); } } diff --git a/src/dird/vbackup.c b/src/dird/vbackup.c index 67fcfd4feab..942dc7b0307 100644 --- a/src/dird/vbackup.c +++ b/src/dird/vbackup.c @@ -347,7 +347,7 @@ void native_vbackup_cleanup(JCR *jcr, int TermCode) msg_type = M_ERROR; /* Generate error message */ if (jcr->store_bsock) { jcr->store_bsock->signal(BNET_TERMINATE); - if (jcr->SD_msg_chan) { + if (jcr->SD_msg_chan_started) { pthread_cancel(jcr->SD_msg_chan); } } @@ -356,7 +356,7 @@ void native_vbackup_cleanup(JCR *jcr, int TermCode) term_msg = _("Backup Canceled"); if (jcr->store_bsock) { jcr->store_bsock->signal(BNET_TERMINATE); - if (jcr->SD_msg_chan) { + if (jcr->SD_msg_chan_started) { pthread_cancel(jcr->SD_msg_chan); } } diff --git a/src/include/jcr.h b/src/include/jcr.h index c2d2df18ab6..4585ad343f3 100644 --- a/src/include/jcr.h +++ b/src/include/jcr.h @@ -413,6 +413,7 @@ class JCR { * Director Daemon specific data part of JCR */ pthread_t SD_msg_chan; /* Message channel thread id */ + bool SD_msg_chan_started; /* Message channel thread started */ pthread_cond_t term_wait; /* Wait for job termination */ pthread_cond_t nextrun_ready; /* Wait for job next run to become ready */ workq_ele_t *work_item; /* Work queue item if scheduled */