提交 ed495504 authored 作者: Giovanni Maruzzelli's avatar Giovanni Maruzzelli

skypiax: avoid memory leaks and overhead by reusing the same audiothreads…

skypiax: avoid memory leaks and overhead by reusing the same audiothreads spawned with first call (they no more exit at call end)

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@14594 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 2ff0b7dc
...@@ -570,10 +570,17 @@ static switch_status_t channel_kill_channel(switch_core_session_t *session, int ...@@ -570,10 +570,17 @@ static switch_status_t channel_kill_channel(switch_core_session_t *session, int
switch_clear_flag(tech_pvt, TFLAG_VOICE); switch_clear_flag(tech_pvt, TFLAG_VOICE);
switch_set_flag(tech_pvt, TFLAG_HANGUP); switch_set_flag(tech_pvt, TFLAG_HANGUP);
if (tech_pvt->skype_callflow == CALLFLOW_STATUS_REMOTEHOLD) { if (tech_pvt->skype_callflow == CALLFLOW_STATUS_REMOTEHOLD) {
ERRORA("%s CHANNEL got SWITCH_SIG_KILL\n", SKYPIAX_P_LOG, switch_channel_get_name(channel)); ERRORA("FYI %s CHANNEL in CALLFLOW_STATUS_REMOTEHOLD got SWITCH_SIG_KILL\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
channel_on_hangup(session);
}
if (switch_channel_get_state(channel) == CS_NEW) {
ERRORA("FYI %s CHANNEL in CS_NEW state got SWITCH_SIG_KILL\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
channel_on_hangup(session);
}
if ( switch_channel_get_state(channel) != CS_NEW && switch_channel_get_state(channel) < CS_EXECUTE) {
ERRORA("FYI %s CHANNEL in %d state got SWITCH_SIG_KILL\n", SKYPIAX_P_LOG, switch_channel_get_name(channel), switch_channel_get_state(channel));
channel_on_hangup(session); channel_on_hangup(session);
} }
//switch_mutex_unlock(tech_pvt->flag_mutex); //switch_mutex_unlock(tech_pvt->flag_mutex);
break; break;
case SWITCH_SIG_BREAK: case SWITCH_SIG_BREAK:
...@@ -1281,6 +1288,7 @@ static switch_status_t load_config(int reload_type) ...@@ -1281,6 +1288,7 @@ static switch_status_t load_config(int reload_type)
WARNINGA("STARTING interface_id=%d\n", SKYPIAX_P_LOG, interface_id); WARNINGA("STARTING interface_id=%d\n", SKYPIAX_P_LOG, interface_id);
switch_threadattr_create(&skypiax_api_thread_attr, skypiax_module_pool); switch_threadattr_create(&skypiax_api_thread_attr, skypiax_module_pool);
switch_threadattr_detach_set(skypiax_api_thread_attr, 1);
switch_threadattr_stacksize_set(skypiax_api_thread_attr, SWITCH_THREAD_STACKSIZE); switch_threadattr_stacksize_set(skypiax_api_thread_attr, SWITCH_THREAD_STACKSIZE);
switch_thread_create(&globals.SKYPIAX_INTERFACES[interface_id].skypiax_api_thread, switch_thread_create(&globals.SKYPIAX_INTERFACES[interface_id].skypiax_api_thread,
skypiax_api_thread_attr, skypiax_do_skypeapi_thread, &globals.SKYPIAX_INTERFACES[interface_id], skypiax_module_pool); skypiax_api_thread_attr, skypiax_do_skypeapi_thread, &globals.SKYPIAX_INTERFACES[interface_id], skypiax_module_pool);
...@@ -1288,6 +1296,7 @@ static switch_status_t load_config(int reload_type) ...@@ -1288,6 +1296,7 @@ static switch_status_t load_config(int reload_type)
switch_sleep(100000); switch_sleep(100000);
switch_threadattr_create(&skypiax_signaling_thread_attr, skypiax_module_pool); switch_threadattr_create(&skypiax_signaling_thread_attr, skypiax_module_pool);
switch_threadattr_detach_set(skypiax_signaling_thread_attr, 1);
switch_threadattr_stacksize_set(skypiax_signaling_thread_attr, SWITCH_THREAD_STACKSIZE); switch_threadattr_stacksize_set(skypiax_signaling_thread_attr, SWITCH_THREAD_STACKSIZE);
switch_thread_create(&globals.SKYPIAX_INTERFACES[interface_id]. switch_thread_create(&globals.SKYPIAX_INTERFACES[interface_id].
skypiax_signaling_thread, skypiax_signaling_thread_attr, skypiax_signaling_thread, skypiax_signaling_thread_attr,
...@@ -1793,7 +1802,7 @@ SWITCH_STANDARD_API(sk_function) ...@@ -1793,7 +1802,7 @@ SWITCH_STANDARD_API(sk_function)
if (strlen(globals.SKYPIAX_INTERFACES[i].name)) { if (strlen(globals.SKYPIAX_INTERFACES[i].name)) {
stream->write_function(stream, stream->write_function(stream,
"%c %d\t[%s]\t%3ld/%ld\t%6ld/%ld\t%s\t%s\t%s\n", "%c %d\t[%s]\t%3u/%u\t%6u/%u\t%s\t%s\t%s\n",
next_flag_char, next_flag_char,
i, globals.SKYPIAX_INTERFACES[i].name, i, globals.SKYPIAX_INTERFACES[i].name,
globals.SKYPIAX_INTERFACES[i].ib_failed_calls, globals.SKYPIAX_INTERFACES[i].ib_failed_calls,
...@@ -1808,7 +1817,7 @@ SWITCH_STANDARD_API(sk_function) ...@@ -1808,7 +1817,7 @@ SWITCH_STANDARD_API(sk_function)
} }
stream->write_function(stream, "\nTotal Interfaces: %d IB Calls(Failed/Total): %ld/%ld OB Calls(Failed/Total): %ld/%ld\n", stream->write_function(stream, "\nTotal Interfaces: %d IB Calls(Failed/Total): %ld/%ld OB Calls(Failed/Total): %ld/%ld\n",
globals.real_interfaces - 1, ib_failed, ib, ob_failed, ob); globals.real_interfaces > 0 ? globals.real_interfaces - 1 : 0, ib_failed, ib, ob_failed, ob);
} else if (!strcasecmp(argv[0], "console")) { } else if (!strcasecmp(argv[0], "console")) {
int i; int i;
......
...@@ -322,9 +322,12 @@ int skypiax_signaling_read(private_t * tech_pvt) ...@@ -322,9 +322,12 @@ int skypiax_signaling_read(private_t * tech_pvt)
tech_pvt->skype_callflow = CALLFLOW_STATUS_EARLYMEDIA; tech_pvt->skype_callflow = CALLFLOW_STATUS_EARLYMEDIA;
tech_pvt->interface_state = SKYPIAX_STATE_DIALING; tech_pvt->interface_state = SKYPIAX_STATE_DIALING;
DEBUGA_SKYPE("Our remote party in skype_call %s is EARLYMEDIA\n", SKYPIAX_P_LOG, id); DEBUGA_SKYPE("Our remote party in skype_call %s is EARLYMEDIA\n", SKYPIAX_P_LOG, id);
if (start_audio_threads(tech_pvt)) { if(tech_pvt->tcp_cli_thread == NULL){
ERRORA("start_audio_threads FAILED\n", SKYPIAX_P_LOG); DEBUGA_SKYPE("START start_audio_threads\n", SKYPIAX_P_LOG);
return CALLFLOW_INCOMING_HANGUP; if (start_audio_threads(tech_pvt)) {
ERRORA("start_audio_threads FAILED\n", SKYPIAX_P_LOG);
return CALLFLOW_INCOMING_HANGUP;
}
} }
skypiax_sleep(1000); skypiax_sleep(1000);
sprintf(msg_to_skype, "ALTER CALL %s SET_INPUT PORT=\"%d\"", id, tech_pvt->tcp_cli_port); sprintf(msg_to_skype, "ALTER CALL %s SET_INPUT PORT=\"%d\"", id, tech_pvt->tcp_cli_port);
...@@ -405,15 +408,18 @@ int skypiax_signaling_read(private_t * tech_pvt) ...@@ -405,15 +408,18 @@ int skypiax_signaling_read(private_t * tech_pvt)
if (!strlen(tech_pvt->session_uuid_str) || !strlen(tech_pvt->skype_call_id) if (!strlen(tech_pvt->session_uuid_str) || !strlen(tech_pvt->skype_call_id)
|| !strcasecmp(tech_pvt->skype_call_id, id)) { || !strcasecmp(tech_pvt->skype_call_id, id)) {
skypiax_strncpy(tech_pvt->skype_call_id, id, sizeof(tech_pvt->skype_call_id) - 1); skypiax_strncpy(tech_pvt->skype_call_id, id, sizeof(tech_pvt->skype_call_id) - 1);
tech_pvt->skype_callflow = CALLFLOW_STATUS_INPROGRESS;
DEBUGA_SKYPE("skype_call: %s is now active\n", SKYPIAX_P_LOG, id); DEBUGA_SKYPE("skype_call: %s is now active\n", SKYPIAX_P_LOG, id);
if (tech_pvt->skype_callflow != CALLFLOW_STATUS_EARLYMEDIA) { if (tech_pvt->skype_callflow != CALLFLOW_STATUS_EARLYMEDIA) {
tech_pvt->skype_callflow = CALLFLOW_STATUS_INPROGRESS;
tech_pvt->interface_state = SKYPIAX_STATE_UP; tech_pvt->interface_state = SKYPIAX_STATE_UP;
if (start_audio_threads(tech_pvt)) { if(tech_pvt->tcp_cli_thread == NULL){
ERRORA("start_audio_threads FAILED\n", SKYPIAX_P_LOG); DEBUGA_SKYPE("START start_audio_threads\n", SKYPIAX_P_LOG);
return CALLFLOW_INCOMING_HANGUP; if (start_audio_threads(tech_pvt)) {
ERRORA("start_audio_threads FAILED\n", SKYPIAX_P_LOG);
return CALLFLOW_INCOMING_HANGUP;
}
} }
skypiax_sleep(1000); //FIXME skypiax_sleep(1000); //FIXME
sprintf(msg_to_skype, "ALTER CALL %s SET_INPUT PORT=\"%d\"", id, tech_pvt->tcp_cli_port); sprintf(msg_to_skype, "ALTER CALL %s SET_INPUT PORT=\"%d\"", id, tech_pvt->tcp_cli_port);
...@@ -422,6 +428,7 @@ int skypiax_signaling_read(private_t * tech_pvt) ...@@ -422,6 +428,7 @@ int skypiax_signaling_read(private_t * tech_pvt)
sprintf(msg_to_skype, "#output ALTER CALL %s SET_OUTPUT PORT=\"%d\"", id, tech_pvt->tcp_srv_port); sprintf(msg_to_skype, "#output ALTER CALL %s SET_OUTPUT PORT=\"%d\"", id, tech_pvt->tcp_srv_port);
skypiax_signaling_write(tech_pvt, msg_to_skype); skypiax_signaling_write(tech_pvt, msg_to_skype);
} }
tech_pvt->skype_callflow = CALLFLOW_STATUS_INPROGRESS;
if (!strlen(tech_pvt->session_uuid_str)) { if (!strlen(tech_pvt->session_uuid_str)) {
DEBUGA_SKYPE("New Inbound Channel!\n\n\n\n", SKYPIAX_P_LOG); DEBUGA_SKYPE("New Inbound Channel!\n\n\n\n", SKYPIAX_P_LOG);
new_inbound_channel(tech_pvt); new_inbound_channel(tech_pvt);
...@@ -550,7 +557,7 @@ void *skypiax_do_tcp_srv_thread_func(void *obj) ...@@ -550,7 +557,7 @@ void *skypiax_do_tcp_srv_thread_func(void *obj)
/****************************/ /****************************/
while ((fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) { while (s > 0 && (fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) {
DEBUGA_SKYPE("ACCEPTED here I send you %d\n", SKYPIAX_P_LOG, tech_pvt->tcp_srv_port); DEBUGA_SKYPE("ACCEPTED here I send you %d\n", SKYPIAX_P_LOG, tech_pvt->tcp_srv_port);
if (!(running && tech_pvt->running)) if (!(running && tech_pvt->running))
break; break;
...@@ -655,15 +662,13 @@ void *skypiax_do_tcp_srv_thread_func(void *obj) ...@@ -655,15 +662,13 @@ void *skypiax_do_tcp_srv_thread_func(void *obj)
DEBUGA_SKYPE("Skype incoming audio GONE\n", SKYPIAX_P_LOG); DEBUGA_SKYPE("Skype incoming audio GONE\n", SKYPIAX_P_LOG);
skypiax_close_socket(fd); skypiax_close_socket(fd);
//if (exit)
break;
} }
} }
} }
DEBUGA_SKYPE("incoming audio server (I am it) EXITING\n", SKYPIAX_P_LOG); DEBUGA_SKYPE("incoming audio server (I am it) EXITING\n", SKYPIAX_P_LOG);
skypiax_close_socket(s); skypiax_close_socket(s);
tech_pvt->tcp_srv_thread = NULL; s=-1;
return NULL; return NULL;
} }
...@@ -725,7 +730,7 @@ void *skypiax_do_tcp_cli_thread_func(void *obj) ...@@ -725,7 +730,7 @@ void *skypiax_do_tcp_cli_thread_func(void *obj)
/****************************/ /****************************/
while ((fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) { while (s > 0 && (fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) {
DEBUGA_SKYPE("ACCEPTED here you send me %d\n", SKYPIAX_P_LOG, tech_pvt->tcp_cli_port); DEBUGA_SKYPE("ACCEPTED here you send me %d\n", SKYPIAX_P_LOG, tech_pvt->tcp_cli_port);
#ifndef WIN32 #ifndef WIN32
fcntl(tech_pvt->audioskypepipe[0], F_SETFL, O_NONBLOCK); fcntl(tech_pvt->audioskypepipe[0], F_SETFL, O_NONBLOCK);
...@@ -836,14 +841,13 @@ void *skypiax_do_tcp_cli_thread_func(void *obj) ...@@ -836,14 +841,13 @@ void *skypiax_do_tcp_cli_thread_func(void *obj)
} }
DEBUGA_SKYPE("Skype outbound audio GONE\n", SKYPIAX_P_LOG); DEBUGA_SKYPE("Skype outbound audio GONE\n", SKYPIAX_P_LOG);
skypiax_close_socket(fd); skypiax_close_socket(fd);
break;
} }
} }
} }
DEBUGA_SKYPE("outbound audio server (I am it) EXITING\n", SKYPIAX_P_LOG); DEBUGA_SKYPE("outbound audio server (I am it) EXITING\n", SKYPIAX_P_LOG);
skypiax_close_socket(s); skypiax_close_socket(s);
tech_pvt->tcp_cli_thread = NULL; s=-1;
return NULL; return NULL;
} }
...@@ -949,8 +953,12 @@ int skypiax_pipe_read(int pipe, short *buf, int howmany) ...@@ -949,8 +953,12 @@ int skypiax_pipe_read(int pipe, short *buf, int howmany)
int skypiax_pipe_write(int pipe, short *buf, int howmany) int skypiax_pipe_write(int pipe, short *buf, int howmany)
{ {
howmany = write(pipe, buf, howmany); if(buf){
return howmany; howmany = write(pipe, buf, howmany);
return howmany;
} else {
return 0;
}
} }
int skypiax_close_socket(unsigned int fd) int skypiax_close_socket(unsigned int fd)
...@@ -1452,6 +1460,8 @@ void *skypiax_do_skypeapi_thread_func(void *obj) ...@@ -1452,6 +1460,8 @@ void *skypiax_do_skypeapi_thread_func(void *obj)
if (!skypiax_send_message(SkypiaxHandles, buf)) { if (!skypiax_send_message(SkypiaxHandles, buf)) {
ERRORA("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch Skypiax again\n", SKYPIAX_P_LOG); ERRORA("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch Skypiax again\n", SKYPIAX_P_LOG);
running = 0; running = 0;
if(disp)
XCloseDisplay(disp);
return NULL; return NULL;
} }
...@@ -1459,6 +1469,8 @@ void *skypiax_do_skypeapi_thread_func(void *obj) ...@@ -1459,6 +1469,8 @@ void *skypiax_do_skypeapi_thread_func(void *obj)
if (!skypiax_send_message(SkypiaxHandles, buf)) { if (!skypiax_send_message(SkypiaxHandles, buf)) {
ERRORA("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch Skypiax again\n", SKYPIAX_P_LOG); ERRORA("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch Skypiax again\n", SKYPIAX_P_LOG);
running = 0; running = 0;
if(disp)
XCloseDisplay(disp);
return NULL; return NULL;
} }
...@@ -1472,6 +1484,7 @@ void *skypiax_do_skypeapi_thread_func(void *obj) ...@@ -1472,6 +1484,7 @@ void *skypiax_do_skypeapi_thread_func(void *obj)
Atom atom_begin = XInternAtom(disp, "SKYPECONTROLAPI_MESSAGE_BEGIN", False); Atom atom_begin = XInternAtom(disp, "SKYPECONTROLAPI_MESSAGE_BEGIN", False);
Atom atom_continue = XInternAtom(disp, "SKYPECONTROLAPI_MESSAGE", False); Atom atom_continue = XInternAtom(disp, "SKYPECONTROLAPI_MESSAGE", False);
memset(buffer, '\0', 17000);
b = buffer; b = buffer;
while (1) { while (1) {
...@@ -1539,9 +1552,13 @@ void *skypiax_do_skypeapi_thread_func(void *obj) ...@@ -1539,9 +1552,13 @@ void *skypiax_do_skypeapi_thread_func(void *obj)
} else { } else {
ERRORA("Skype is not running, maybe crashed. Please run/restart Skype and relaunch Skypiax\n", SKYPIAX_P_LOG); ERRORA("Skype is not running, maybe crashed. Please run/restart Skype and relaunch Skypiax\n", SKYPIAX_P_LOG);
running = 0; running = 0;
if(disp)
XCloseDisplay(disp);
return NULL; return NULL;
} }
//running = 0; //running = 0;
if(disp)
XCloseDisplay(disp);
return NULL; return NULL;
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论