* Rob Charlton <rob.charlton@savageminds.com>
* Darren Schreiber <d@d-man.org>
* Mike Jerris <mike@jerris.com>
+ * Tamas Cseke <tamas.cseke@virtual-call-center.eu>
*
*
* handle_msg.c -- handle messages received from erlang nodes
switch_set_flag_locked(listener, LFLAG_EVENTS);
}
- /* TODO - listener write lock */
+ switch_thread_rwlock_wrlock(listener->event_rwlock);
+
for (i = 1; i < arity; i++) {
if (!ei_decode_atom(buf->buff, &buf->index, atom)) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "enable event %s\n", atom);
}
}
+ switch_thread_rwlock_unlock(listener->event_rwlock);
+
ei_x_encode_atom(rbuf, "ok");
}
return SWITCH_STATUS_SUCCESS;
int i = 0;
switch_event_types_t type;
- /* TODO listener write lock */
+ switch_thread_rwlock_wrlock(listener->event_rwlock);
+
for (i = 1; i < arity; i++) {
if (!ei_decode_atom(buf->buff, &buf->index, atom)) {
}
}
}
+
+ switch_thread_rwlock_unlock(listener->event_rwlock);
ei_x_encode_atom(rbuf, "ok");
}
return SWITCH_STATUS_SUCCESS;
}
}
/* update the event subscriptions with the new ones */
+ switch_thread_rwlock_wrlock(listener->event_rwlock);
memcpy(listener->event_list, event_list, sizeof(uint8_t) * (SWITCH_EVENT_ALL + 1));
- /* wipe the old hash, and point the pointer at the new one */
- /* TODO make thread safe */
switch_core_hash_destroy(&listener->event_hash);
listener->event_hash = event_hash;
+ switch_thread_rwlock_unlock(listener->event_rwlock);
/* TODO - we should flush any non-matching events from the queue */
ei_x_encode_atom(rbuf, "ok");
if (switch_test_flag(listener, LFLAG_EVENTS)) {
uint8_t x = 0;
switch_clear_flag_locked(listener, LFLAG_EVENTS);
+
+ switch_thread_rwlock_wrlock(listener->event_rwlock);
for (x = 0; x <= SWITCH_EVENT_ALL; x++) {
listener->event_list[x] = 0;
}
- /* wipe the hash */
- /* TODO make thread safe*/
- switch_core_hash_destroy(&listener->event_hash);
+
+ switch_core_hash_delete_multi(listener->event_hash, NULL, NULL);
switch_core_hash_init(&listener->event_hash, listener->pool);
+
+ switch_thread_rwlock_unlock(listener->event_rwlock);
ei_x_encode_atom(rbuf, "ok");
} else {
ei_x_encode_tuple_header(rbuf, 2);
* Anthony Minessale II <anthm@freeswitch.org>
* Andrew Thompson <andrew@hijacked.us>
* Rob Charlton <rob.charlton@savageminds.com>
+ * Tamas Cseke <tamas.cseke@virtual-call-center.eu>
*
*
* mod_erlang_event.c -- Erlang Event Handler derived from mod_event_socket
continue;
}
+ switch_thread_rwlock_rdlock(l->event_rwlock);
+
if (l->event_list[SWITCH_EVENT_ALL]) {
send = 1;
} else if ((l->event_list[event->event_id])) {
}
}
+ switch_thread_rwlock_unlock(l->event_rwlock);
if (send) {
if (switch_event_dup(&clone, event) == SWITCH_STATUS_SUCCESS) {
uint8_t x = 0;
switch_clear_flag_locked(listener, LFLAG_EVENTS);
+ switch_thread_rwlock_wrlock(listener->event_rwlock);
for (x = 0; x <= SWITCH_EVENT_ALL; x++) {
listener->event_list[x] = 0;
}
- /* wipe the hash */
- /* XXX this needs to be locked */
- /* TODO switch_core_hash_delete_multi_locked */
- switch_core_hash_destroy(&listener->event_hash);
- switch_core_hash_init(&listener->event_hash, listener->pool);
+ switch_core_hash_delete_multi(listener->event_hash, NULL, NULL);
+ switch_thread_rwlock_unlock(listener->event_rwlock);
}
}
}
}
memset(listener, 0, sizeof(*listener));
- switch_thread_rwlock_create(&listener->rwlock, pool);
switch_queue_create(&listener->event_queue, SWITCH_CORE_QUEUE_LEN, pool);
switch_queue_create(&listener->log_queue, SWITCH_CORE_QUEUE_LEN, pool);
listener->level = SWITCH_LOG_DEBUG;
switch_mutex_init(&listener->flag_mutex, SWITCH_MUTEX_NESTED, listener->pool);
switch_mutex_init(&listener->sock_mutex, SWITCH_MUTEX_NESTED, listener->pool);
+
+ switch_thread_rwlock_create(&listener->rwlock, pool);
+ switch_thread_rwlock_create(&listener->event_rwlock, pool);
switch_thread_rwlock_create(&listener->session_rwlock, listener->pool);
+
switch_core_hash_init(&listener->event_hash, listener->pool);
switch_core_hash_init(&listener->sessions, listener->pool);