mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-03-05 18:13:27 +00:00
fix bug/race in core
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@4170 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
58310a9272
commit
5327a156ee
src
@ -485,6 +485,8 @@ CF_CONTROLLED = (1 << 12) - Channel is under control
|
|||||||
CF_NOMEDIA = (1 << 13) - Channel has no media
|
CF_NOMEDIA = (1 << 13) - Channel has no media
|
||||||
CF_SUSPEND = (1 << 14) - Suspend i/o
|
CF_SUSPEND = (1 << 14) - Suspend i/o
|
||||||
CF_EVENT_PARSE = (1 << 15) - Suspend control events
|
CF_EVENT_PARSE = (1 << 15) - Suspend control events
|
||||||
|
CF_NO_INDICATE = (1 << 16) - Disable Indications
|
||||||
|
CF_REPEAT_STATE = (1 << 17) - Tell the state machine to repeat a state
|
||||||
</pre>
|
</pre>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -505,7 +507,8 @@ typedef enum {
|
|||||||
CF_NOMEDIA = (1 << 13),
|
CF_NOMEDIA = (1 << 13),
|
||||||
CF_SUSPEND = (1 << 14),
|
CF_SUSPEND = (1 << 14),
|
||||||
CF_EVENT_PARSE = (1 << 15),
|
CF_EVENT_PARSE = (1 << 15),
|
||||||
CF_NO_INDICATE = (1 << 16)
|
CF_NO_INDICATE = (1 << 16),
|
||||||
|
CF_REPEAT_STATE = (1 << 17)
|
||||||
} switch_channel_flag_t;
|
} switch_channel_flag_t;
|
||||||
|
|
||||||
|
|
||||||
|
@ -3014,6 +3014,7 @@ SWITCH_DECLARE(void) switch_core_session_run(switch_core_session_t *session)
|
|||||||
const switch_endpoint_interface_t *endpoint_interface;
|
const switch_endpoint_interface_t *endpoint_interface;
|
||||||
const switch_state_handler_table_t *driver_state_handler = NULL;
|
const switch_state_handler_table_t *driver_state_handler = NULL;
|
||||||
const switch_state_handler_table_t *application_state_handler = NULL;
|
const switch_state_handler_table_t *application_state_handler = NULL;
|
||||||
|
|
||||||
#ifdef CRASH_PROT
|
#ifdef CRASH_PROT
|
||||||
switch_thread_id_t thread_id = switch_thread_self();
|
switch_thread_id_t thread_id = switch_thread_self();
|
||||||
jmp_buf env;
|
jmp_buf env;
|
||||||
@ -3065,7 +3066,12 @@ SWITCH_DECLARE(void) switch_core_session_run(switch_core_session_t *session)
|
|||||||
switch_mutex_lock(session->mutex);
|
switch_mutex_lock(session->mutex);
|
||||||
|
|
||||||
while ((state = switch_channel_get_state(session->channel)) != CS_DONE) {
|
while ((state = switch_channel_get_state(session->channel)) != CS_DONE) {
|
||||||
if (state != laststate) {
|
uint8_t exception = 0;
|
||||||
|
if (switch_channel_test_flag(session->channel, CF_REPEAT_STATE)) {
|
||||||
|
switch_channel_clear_flag(session->channel, CF_REPEAT_STATE);
|
||||||
|
exception = 1;
|
||||||
|
}
|
||||||
|
if (state != laststate || state == CS_HANGUP || exception) {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
int proceed = 1;
|
int proceed = 1;
|
||||||
midstate = state;
|
midstate = state;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user