int done;
switch_thread_t *thread;
switch_mutex_t *mutex;
+ switch_mutex_t *fence_mutex;
switch_dial_handle_t *dh;
} enterprise_originate_handle_t;
static void *SWITCH_THREAD_FUNC enterprise_originate_thread(switch_thread_t *thread, void *obj)
{
enterprise_originate_handle_t *handle = (enterprise_originate_handle_t *) obj;
+ switch_status_t status;
+ switch_mutex_lock(handle->fence_mutex);
handle->done = 0;
- handle->status = switch_ivr_originate(NULL, &handle->bleg, &handle->cause,
+ switch_mutex_unlock(handle->fence_mutex);
+
+ status = switch_ivr_originate(NULL, &handle->bleg, &handle->cause,
handle->bridgeto, handle->timelimit_sec,
handle->table,
handle->cid_name_override,
&handle->cancel_cause,
handle->dh);
-
+ switch_mutex_lock(handle->fence_mutex);
+ handle->status = status;
handle->done = 1;
+ switch_mutex_unlock(handle->fence_mutex);
+
switch_mutex_lock(handle->mutex);
switch_mutex_unlock(handle->mutex);
switch_dial_handle_dup(&handles[i].dh, hl->handles[i]);
}
switch_mutex_init(&handles[i].mutex, SWITCH_MUTEX_NESTED, pool);
+ switch_mutex_init(&handles[i].fence_mutex, SWITCH_MUTEX_NESTED, pool);
switch_mutex_lock(handles[i].mutex);
switch_thread_create(&handles[i].thread, thd_attr, enterprise_originate_thread, &handles[i], pool);
}
for (i = 0; i < x_argc; i++) {
-
+ switch_mutex_lock(handles[i].fence_mutex);
if (handles[i].done == 0) {
running++;
} else if (handles[i].done == 1) {
if (handles[i].status == SWITCH_STATUS_SUCCESS) {
handles[i].done = 2;
hp = &handles[i];
+ switch_mutex_unlock(handles[i].fence_mutex);
goto done;
} else {
handles[i].done = -1;
over++;
}
+ switch_mutex_unlock(handles[i].fence_mutex);
+
switch_yield(10000);
}