static switch_queue_t *EVENT_DISPATCH_QUEUE = NULL;
static switch_queue_t *EVENT_CHANNEL_DISPATCH_QUEUE = NULL;
static switch_mutex_t *EVENT_QUEUE_MUTEX = NULL;
+static switch_mutex_t *CUSTOM_HASH_MUTEX = NULL;
static switch_hash_t *CUSTOM_HASH = NULL;
static int THREAD_COUNT = 0;
static int DISPATCH_THREAD_COUNT = 0;
switch_event_subclass_t *subclass;
switch_status_t status = SWITCH_STATUS_FALSE;
+ switch_mutex_lock(CUSTOM_HASH_MUTEX);
+
switch_assert(RUNTIME_POOL != NULL);
switch_assert(CUSTOM_HASH != NULL);
}
}
+ switch_mutex_unlock(CUSTOM_HASH_MUTEX);
+
return status;
}
SWITCH_DECLARE(switch_status_t) switch_event_reserve_subclass_detailed(const char *owner, const char *subclass_name)
{
+ switch_status_t status = SWITCH_STATUS_SUCCESS;
switch_event_subclass_t *subclass;
+ switch_mutex_lock(CUSTOM_HASH_MUTEX);
+
switch_assert(RUNTIME_POOL != NULL);
switch_assert(CUSTOM_HASH != NULL);
/* a listener reserved it for us, now we can lock it so nobody else can have it */
if (subclass->bind) {
subclass->bind = 0;
- return SWITCH_STATUS_SUCCESS;
+ switch_goto_status(SWITCH_STATUS_SUCCESS, end);
}
- return SWITCH_STATUS_INUSE;
+ switch_goto_status(SWITCH_STATUS_INUSE, end);
}
switch_zmalloc(subclass, sizeof(*subclass));
switch_core_hash_insert(CUSTOM_HASH, subclass->name, subclass);
- return SWITCH_STATUS_SUCCESS;
+end:
+
+ switch_mutex_unlock(CUSTOM_HASH_MUTEX);
+
+ return status;
}
SWITCH_DECLARE(void) switch_core_memory_reclaim_events(void)
switch_mutex_init(&BLOCK, SWITCH_MUTEX_NESTED, RUNTIME_POOL);
switch_mutex_init(&POOL_LOCK, SWITCH_MUTEX_NESTED, RUNTIME_POOL);
switch_mutex_init(&EVENT_QUEUE_MUTEX, SWITCH_MUTEX_NESTED, RUNTIME_POOL);
+ switch_mutex_init(&CUSTOM_HASH_MUTEX, SWITCH_MUTEX_NESTED, RUNTIME_POOL);
switch_core_hash_init(&CUSTOM_HASH);
if (switch_core_test_flag(SCF_MINIMAL)) {
void *val;
int x = 0;
+ switch_mutex_lock(CUSTOM_HASH_MUTEX);
+
for (hi = switch_core_hash_first(CUSTOM_HASH); hi; hi = switch_core_hash_next(&hi)) {
switch_core_hash_this(hi, &var, NULL, &val);
switch_console_push_match(matches, (const char *) var);
x++;
}
+ switch_mutex_unlock(CUSTOM_HASH_MUTEX);
+
return x ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE;
}
}
if (subclass_name) {
+ switch_mutex_lock(CUSTOM_HASH_MUTEX);
+
if (!(subclass = switch_core_hash_find(CUSTOM_HASH, subclass_name))) {
switch_event_reserve_subclass_detailed(id, subclass_name);
subclass = switch_core_hash_find(CUSTOM_HASH, subclass_name);
subclass->bind = 1;
}
+
+ switch_mutex_unlock(CUSTOM_HASH_MUTEX);
+
if (!subclass) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Could not reserve subclass. '%s'\n", subclass_name);
return SWITCH_STATUS_FALSE;