[Freeswitch-dev] Need some explainations about method switch_core_session_run(switch_core_session_t *session) in switch_core_state_machine.c
Alex To
tonhudung at gmail.com
Wed Jan 6 07:20:16 PST 2010
Hi,
First of all, pardon my English. English isnt my native language J.
I am reading the method switch_core_session_run(switch_core_session_t
*session) and I would be really appreciated if someone could shed some light
on how the method works. Below is the logic according to my understanding:
1. LINE 303: while ((state =
switch_channel_get_state(session->channel)) != CS_DESTROY)
ð if state is CS_DESTROY return and do nothing ?
2. Inside if (state !=
switch_channel_get_running_state(session->channel) || state >= CS_HANGUP)
{
}
a. LINE 308: state !=
switch_channel_get_running_state(session->channel) || state >= CS_HANGUP
ð to check if channel->state and channel->running_state not equal. This is
to avoid running the STATE_MACRO multiple times. However I dont understand
why do we need (state >= CS_HANGUP) ?.
b. Inside STATE_MACRO code block
i. LINE
229: midstate = state
ð to save the current state.
ii. LINE
231: if (!driver_state_handler->on_##__STATE ||
(driver_state_handler->on_##__STATE(session) == SWITCH_STATUS_SUCCESS)
ð to check either endpoint_interface->state_handler is NULL or return
SWITCH_STATUS_SUCCESS so it will continue to execute handlers in
session->channel, runtime.state_handlers and core standard state handlers.
It means if the condition is not true, channel->state_handlers,
runtime.state_handlers and core standard state handlers will NOT be executed
at all ?
iii. LINE
246: if (!proceed) global_proceed = 0;
ð If something wrong in the previous while loop, do not run core standard
state handlers ?
iv. LINE
247: proceed = 1;
LINE 248: while (do_extra_handlers && proceed &&
(application_state_handler = switch_core_get_state_handler(index++)) != 0) {
}
ð Since we set proceed = 1, do we still need (&& proceed) inside the
condition in while loop ?
v. LINE
260: if (!proceed || midstate !=
switch_channel_get_state(session->channel)) global_proceed = 0;
ð If not proceed or the channel state has changed by some of the state
handlers executed earlier, do not execute core standard state handler ?
vi. LINE
266: while (silly)
ð silly is never changed, does it mean we could go into an endless while
loop ?
Sorry for the long email and some questions are probably dumb but I am
trying to understand about FreeSwitch, especially the core and the core
state machine. If it is documented somewhere about the workflow happening
inside FreeSwitch, please enlighten me as what I am doing now is to read the
code line by line and figure out which may not be the most efficient .
Thank you for reading this
Regards
Alex To
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-dev/attachments/20100106/74b51d00/attachment-0001.html
More information about the FreeSWITCH-dev
mailing list