提交 ce11c295 authored 作者: Andrew Thompson's avatar Andrew Thompson

Ensure events received while a pid session is being created aren't discarded but are queued instead


git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11500 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 c86ccc93
......@@ -487,6 +487,10 @@ static switch_status_t check_attached_sessions(listener_t *listener)
sp = listener->session_list;
last = NULL;
while(sp) {
if (switch_test_flag(sp, LFLAG_WAITING_FOR_PID)) {
break;
}
if (!switch_test_flag(sp, LFLAG_OUTBOUND_INIT)) {
status = notify_new_session(listener, sp->session, sp->process);
if (status != SWITCH_STATUS_SUCCESS)
......@@ -494,7 +498,7 @@ static switch_status_t check_attached_sessions(listener_t *listener)
switch_set_flag(sp, LFLAG_OUTBOUND_INIT);
}
/* check event queue for this session */
if (switch_queue_trypop(sp->event_queue, &pop) == SWITCH_STATUS_SUCCESS) {
if (switch_queue_trypop(sp->event_queue, &pop) == SWITCH_STATUS_SUCCESS) {
switch_event_t *pevent = (switch_event_t *) pop;
/* events from attached sessions are wrapped in a {call_event,<EVT>} tuple
......@@ -997,6 +1001,12 @@ session_elem_t* attach_call_to_spawned_process(listener_t* listener, char *modul
erlang_pid *pid;
erlang_ref ref;
switch_set_flag(session_element, LFLAG_WAITING_FOR_PID);
switch_queue_create(&session_element->event_queue, SWITCH_CORE_QUEUE_LEN, switch_core_session_get_pool(session));
switch_mutex_init(&session_element->flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session));
/* attach the session to the listener */
add_session_elem_to_listener(listener,session_element);
if (!strcmp(function, "!")) {
/* send a message to request a pid */
ei_x_buff rbuf;
......@@ -1022,6 +1032,7 @@ session_elem_t* attach_call_to_spawned_process(listener_t* listener, char *modul
if (i > 50) { /* half a second timeout */
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "timed out!\n");
switch_core_session_rwunlock(session);
remove_session_elem_from_listener(listener,session_element);
return NULL;
}
i++;
......@@ -1030,16 +1041,13 @@ session_elem_t* attach_call_to_spawned_process(listener_t* listener, char *modul
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "got pid!\n");
ei_link(listener, ei_self(listener->ec), pid);
session_element->process.type = ERLANG_PID;
memcpy(&session_element->process.pid, pid, sizeof(erlang_pid));
switch_set_flag(session_element, LFLAG_SESSION_ALIVE);
switch_clear_flag(session_element, LFLAG_OUTBOUND_INIT);
switch_queue_create(&session_element->event_queue, SWITCH_CORE_QUEUE_LEN, switch_core_session_get_pool(session));
switch_mutex_init(&session_element->flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session));
/* attach the session to the listener */
add_session_elem_to_listener(listener,session_element);
switch_clear_flag(session_element, LFLAG_WAITING_FOR_PID);
ei_link(listener, ei_self(listener->ec), pid);
}
}
return session_element;
......
......@@ -35,8 +35,9 @@
#define EI_DEBUG
typedef enum {
LFLAG_OUTBOUND_INIT = (1 << 0), /* Erlang peer has been notified of this session */
LFLAG_SESSION_ALIVE
LFLAG_WAITING_FOR_PID = (1 << 0), /* waiting for a node to return a pid */
LFLAG_OUTBOUND_INIT = (1 << 1), /* Erlang peer has been notified of this session */
LFLAG_SESSION_ALIVE = (1 << 2),
} session_flag_t;
typedef enum {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论