JCR *jcr = ((wait_pkt *)arg)->jcr;
jobq_t *jq = ((wait_pkt *)arg)->jq;
- set_jcr_in_tsd(jcr);
+ set_jcr_in_tsd(INVALID_JCR);
Dmsg0(2300, "Enter sched_wait.\n");
free(arg);
time_t wtime = jcr->sched_time - time(NULL);
jq->running_jobs->append(je);
/* Attach jcr to this thread while we run the job */
+ jcr->set_killable(true);
set_jcr_in_tsd(jcr);
Dmsg1(2300, "Took jobid=%d from ready and appended to run\n", jcr->JobId);
/* Job finished detach from thread */
remove_jcr_from_tsd(je->jcr);
+ je->jcr->set_killable(false);
Dmsg2(2300, "Back from user engine jobid=%d use=%d.\n", jcr->JobId,
jcr->use_count());
volatile int32_t _use_count; /* use count */
int32_t m_JobType; /* backup, restore, verify ... */
int32_t m_JobLevel; /* Job level */
+ bool my_thread_killable; /* can we kill the thread? */
public:
void lock() {P(mutex); };
void unlock() {V(mutex); };
void setJobStatus(int JobStatus); /* in lib/jcr.c */
bool JobReads(); /* in lib/jcr.c */
void my_thread_send_signal(int sig); /* in lib/jcr.c */
+ void set_killable(bool killable); /* in lib/jcr.c */
+ bool is_killable() const { return my_thread_killable; };
/* Global part of JCR common to all daemons */
dlink link; /* JCR chain link */
- bool my_thread_running; /* is the thread controlling jcr running*/
pthread_t my_thread_id; /* id of thread controlling jcr */
BSOCK *dir_bsock; /* Director bsock or NULL if we are him */
BSOCK *store_bsock; /* Storage connection socket */
jcr->setJobType(JT_SYSTEM); /* internal job until defined */
jcr->setJobLevel(L_NONE);
jcr->setJobStatus(JS_Created); /* ready to run */
- set_jcr_in_tsd(jcr);
sigtimer.sa_flags = 0;
sigtimer.sa_handler = timeout_handler;
sigfillset(&sigtimer.sa_mask);
{
/* Uses jcr lock/unlock */
remove_jcr_from_tsd(jcr);
+ jcr->set_killable(false);
jcr->destroy_mutex();
{
JCR *tjcr = get_jcr_from_tsd();
if (tjcr == jcr) {
- jcr->lock();
- jcr->my_thread_running = false;
- memset(&jcr->my_thread_id, 0, sizeof(jcr->my_thread_id));
- jcr->unlock();
set_jcr_in_tsd(INVALID_JCR);
}
}
+void JCR::set_killable(bool killable)
+{
+ JCR *jcr = this;
+ jcr->lock();
+ jcr->my_thread_killable = killable;
+ if (killable) {
+ jcr->my_thread_id = pthread_self();
+ } else {
+ memset(&jcr->my_thread_id, 0, sizeof(jcr->my_thread_id));
+ }
+ jcr->unlock();
+}
+
/*
* Put this jcr in the thread specifc data
* if update_thread_info is true and the jcr is valide,
* we update the my_thread_id in the JCR
*/
-void set_jcr_in_tsd(JCR *jcr, bool update_thread_info)
+void set_jcr_in_tsd(JCR *jcr)
{
int status = pthread_setspecific(jcr_key, (void *)jcr);
if (status != 0) {
Jmsg1(jcr, M_ABORT, 0, _("pthread_setspecific failed: ERR=%s\n"),
be.bstrerror(status));
}
-
- /* We explicitly ask to set a jcr in tsd, we can update jcr->my_thread
- */
- if (update_thread_info && jcr && jcr != INVALID_JCR) {
- Dmsg2(100, "setting my_thread_stuffs 0x%p => 0x%p\n",
- jcr->my_thread_id, pthread_self());
- jcr->lock();
- //ASSERT(jcr->my_thread_running == false);
- jcr->my_thread_id = pthread_self();
- jcr->my_thread_running = true;
- jcr->unlock();
- }
}
void JCR::my_thread_send_signal(int sig)
{
this->lock();
- if ( this->my_thread_running
- && !pthread_equal(this->my_thread_id, pthread_self()))
+ if (this->is_killable() &&
+ !pthread_equal(this->my_thread_id, pthread_self()))
{
Dmsg1(800, "Send kill to jid=%d\n", this->JobId);
pthread_kill(this->my_thread_id, sig);
- } else if (!this->my_thread_running) {
+ } else if (!this->is_killable()) {
Dmsg1(10, "Warning, can't send kill to jid=%d\n", this->JobId);
}
this->unlock();
for (JCR *jcr = (JCR *)jcrs->first(); jcr ; jcr = (JCR *)jcrs->next(jcr)) {
fprintf(fp, "threadid=%p JobId=%d JobStatus=%c jcr=%p name=%s\n",
(void *)jcr->my_thread_id, (int)jcr->JobId, jcr->JobStatus, jcr, jcr->Job);
+ fprintf(fp, "threadid=%p killable=%d JobId=%d JobStatus=%c "
+ "jcr=%p name=%s\n",
+ (void *)jcr->my_thread_id, jcr->is_killable(),
+ (int)jcr->JobId, jcr->JobStatus, jcr, jcr->Job);
fprintf(fp, "\tuse_count=%i\n", jcr->use_count());
fprintf(fp, "\tJobType=%c JobLevel=%c\n",
jcr->getJobType(), jcr->getJobLevel());