int thread_running;
switch_thread_cond_t *cond;
switch_mutex_t *cond_mutex;
+ switch_mutex_t *cond2_mutex;
switch_mutex_t *mutex;
char *pre_trans_execute;
char *post_trans_execute;
static int qm_wake(switch_sql_queue_manager_t *qm)
{
- if (switch_mutex_trylock(qm->cond_mutex) == SWITCH_STATUS_SUCCESS) {
+ switch_status_t status;
+ int tries = 0;
+
+ top:
+
+ status = switch_mutex_trylock(qm->cond_mutex);
+
+ if (status == SWITCH_STATUS_SUCCESS) {
switch_thread_cond_signal(qm->cond);
switch_mutex_unlock(qm->cond_mutex);
return 1;
+ } else {
+ if (switch_mutex_trylock(qm->cond2_mutex) == SWITCH_STATUS_SUCCESS) {
+ switch_mutex_unlock(qm->cond2_mutex);
+ } else {
+ if (++tries < 10) {
+ switch_cond_next();
+ goto top;
+ }
+ }
}
return 0;
if (qm->thread) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "%s Stopping SQL thread.\n", qm->name);
+ qm_wake(qm);
switch_thread_join(&status, qm->thread);
qm->thread = NULL;
status = SWITCH_STATUS_SUCCESS;
qm->max_trans = max_trans;
switch_mutex_init(&qm->cond_mutex, SWITCH_MUTEX_NESTED, qm->pool);
+ switch_mutex_init(&qm->cond2_mutex, SWITCH_MUTEX_NESTED, qm->pool);
switch_mutex_init(&qm->mutex, SWITCH_MUTEX_NESTED, qm->pool);
switch_thread_cond_create(&qm->cond, qm->pool);
check:
if ((lc = qm_ttl(qm)) == 0) {
+ switch_mutex_lock(qm->cond2_mutex);
switch_thread_cond_wait(qm->cond, qm->cond_mutex);
+ switch_mutex_unlock(qm->cond2_mutex);
}
i = 40;
int64_t executed;
int in_thread;
int destroyed;
+ int running;
switch_scheduler_func_t func;
switch_memory_pool_t *pool;
uint32_t flags;
tp->in_thread = 1;
switch_thread_create(&thread, thd_attr, task_own_thread, tp, tp->pool);
} else {
+ tp->running = 1;
+ switch_mutex_unlock(globals.task_mutex);
switch_scheduler_execute(tp);
+ switch_mutex_lock(globals.task_mutex);
+ tp->running = 0;
}
}
}
tp->task.task_id, tp->task.group);
break;
}
+
+ if (tp->running) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Attempt made to delete running task #%u (group %s)\n",
+ tp->task.task_id, tp->task.group);
+ break;
+ }
+
tp->destroyed++;
if (switch_event_create(&event, SWITCH_EVENT_DEL_SCHEDULE) == SWITCH_STATUS_SUCCESS) {
switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Task-ID", "%u", tp->task.task_id);