<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[Freeswitch-trunk][14594] </title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<div id="header">FreeSWITCH Subversion</div>
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://fisheye.freeswitch.org/changelog/FreeSWITCH?cs=14594">14594</a></dd>
<dt>Author</dt> <dd>gmaruzz</dd>
<dt>Date</dt> <dd>2009-08-22 01:14:38 -0500 (Sat, 22 Aug 2009)</dd>
</dl>
<h3>Log Message</h3>
<pre>skypiax: avoid memory leaks and overhead by reusing the same audiothreads spawned with first call (they no more exit at call end)</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#freeswitchtrunksrcmodendpointsmod_skypiaxmod_skypiaxc">freeswitch/trunk/src/mod/endpoints/mod_skypiax/mod_skypiax.c</a></li>
<li><a href="#freeswitchtrunksrcmodendpointsmod_skypiaxskypiax_protocolc">freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="freeswitchtrunksrcmodendpointsmod_skypiaxmod_skypiaxc"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/mod/endpoints/mod_skypiax/mod_skypiax.c (14593 => 14594)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/mod/endpoints/mod_skypiax/mod_skypiax.c        2009-08-22 01:45:03 UTC (rev 14593)
+++ freeswitch/trunk/src/mod/endpoints/mod_skypiax/mod_skypiax.c        2009-08-22 06:14:38 UTC (rev 14594)
</span><span class="lines">@@ -570,10 +570,17 @@
</span><span class="cx">                 switch_clear_flag(tech_pvt, TFLAG_VOICE);
</span><span class="cx">                 switch_set_flag(tech_pvt, TFLAG_HANGUP);
</span><span class="cx">                 if (tech_pvt->skype_callflow == CALLFLOW_STATUS_REMOTEHOLD) {
</span><del>-                        ERRORA("%s CHANNEL got SWITCH_SIG_KILL\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
</del><ins>+                        ERRORA("FYI %s CHANNEL in CALLFLOW_STATUS_REMOTEHOLD got SWITCH_SIG_KILL\n", SKYPIAX_P_LOG, switch_channel_get_name(channel));
</ins><span class="cx">                         channel_on_hangup(session);
</span><span class="cx">                 }
</span><del>-
</del><ins>+                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);
+                }
</ins><span class="cx">                 //switch_mutex_unlock(tech_pvt->flag_mutex);
</span><span class="cx">                 break;
</span><span class="cx">         case SWITCH_SIG_BREAK:
</span><span class="lines">@@ -1281,6 +1288,7 @@
</span><span class="cx">                                 WARNINGA("STARTING interface_id=%d\n", SKYPIAX_P_LOG, interface_id);
</span><span class="cx">
</span><span class="cx">                                 switch_threadattr_create(&skypiax_api_thread_attr, skypiax_module_pool);
</span><ins>+                                switch_threadattr_detach_set(skypiax_api_thread_attr, 1);
</ins><span class="cx">                                 switch_threadattr_stacksize_set(skypiax_api_thread_attr, SWITCH_THREAD_STACKSIZE);
</span><span class="cx">                                 switch_thread_create(&globals.SKYPIAX_INTERFACES[interface_id].skypiax_api_thread,
</span><span class="cx">                                                                          skypiax_api_thread_attr, skypiax_do_skypeapi_thread, &globals.SKYPIAX_INTERFACES[interface_id], skypiax_module_pool);
</span><span class="lines">@@ -1288,6 +1296,7 @@
</span><span class="cx">                                 switch_sleep(100000);
</span><span class="cx">
</span><span class="cx">                                 switch_threadattr_create(&skypiax_signaling_thread_attr, skypiax_module_pool);
</span><ins>+                                switch_threadattr_detach_set(skypiax_signaling_thread_attr, 1);
</ins><span class="cx">                                 switch_threadattr_stacksize_set(skypiax_signaling_thread_attr, SWITCH_THREAD_STACKSIZE);
</span><span class="cx">                                 switch_thread_create(&globals.SKYPIAX_INTERFACES[interface_id].
</span><span class="cx">                                                                          skypiax_signaling_thread, skypiax_signaling_thread_attr,
</span><span class="lines">@@ -1793,7 +1802,7 @@
</span><span class="cx">
</span><span class="cx">                         if (strlen(globals.SKYPIAX_INTERFACES[i].name)) {
</span><span class="cx">                                 stream->write_function(stream,
</span><del>-                                                                         "%c %d\t[%s]\t%3ld/%ld\t%6ld/%ld\t%s\t%s\t%s\n",
</del><ins>+                                                                         "%c %d\t[%s]\t%3u/%u\t%6u/%u\t%s\t%s\t%s\n",
</ins><span class="cx">                                                                          next_flag_char,
</span><span class="cx">                                                                          i, globals.SKYPIAX_INTERFACES[i].name,
</span><span class="cx">                                                                          globals.SKYPIAX_INTERFACES[i].ib_failed_calls,
</span><span class="lines">@@ -1808,7 +1817,7 @@
</span><span class="cx">
</span><span class="cx">                 }
</span><span class="cx">                 stream->write_function(stream, "\nTotal Interfaces: %d IB Calls(Failed/Total): %ld/%ld OB Calls(Failed/Total): %ld/%ld\n",
</span><del>-                 globals.real_interfaces - 1, ib_failed, ib, ob_failed, ob);
</del><ins>+                 globals.real_interfaces > 0 ? globals.real_interfaces - 1 : 0, ib_failed, ib, ob_failed, ob);
</ins><span class="cx">
</span><span class="cx">         } else if (!strcasecmp(argv[0], "console")) {
</span><span class="cx">                 int i;
</span></span></pre></div>
<a id="freeswitchtrunksrcmodendpointsmod_skypiaxskypiax_protocolc"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c (14593 => 14594)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c        2009-08-22 01:45:03 UTC (rev 14593)
+++ freeswitch/trunk/src/mod/endpoints/mod_skypiax/skypiax_protocol.c        2009-08-22 06:14:38 UTC (rev 14594)
</span><span class="lines">@@ -322,9 +322,12 @@
</span><span class="cx">                                                 tech_pvt->skype_callflow = CALLFLOW_STATUS_EARLYMEDIA;
</span><span class="cx">                                                 tech_pvt->interface_state = SKYPIAX_STATE_DIALING;
</span><span class="cx">                                                 DEBUGA_SKYPE("Our remote party in skype_call %s is EARLYMEDIA\n", SKYPIAX_P_LOG, id);
</span><del>-                                                if (start_audio_threads(tech_pvt)) {
-                                                        ERRORA("start_audio_threads FAILED\n", SKYPIAX_P_LOG);
-                                                        return CALLFLOW_INCOMING_HANGUP;
</del><ins>+                                                if(tech_pvt->tcp_cli_thread == NULL){
+                                                        DEBUGA_SKYPE("START start_audio_threads\n", SKYPIAX_P_LOG);
+                                                        if (start_audio_threads(tech_pvt)) {
+                                                                ERRORA("start_audio_threads FAILED\n", SKYPIAX_P_LOG);
+                                                                return CALLFLOW_INCOMING_HANGUP;
+                                                        }
</ins><span class="cx">                                                 }
</span><span class="cx">                                                 skypiax_sleep(1000);
</span><span class="cx">                                                 sprintf(msg_to_skype, "ALTER CALL %s SET_INPUT PORT=\"%d\"", id, tech_pvt->tcp_cli_port);
</span><span class="lines">@@ -405,15 +408,18 @@
</span><span class="cx">                                                         if (!strlen(tech_pvt->session_uuid_str) || !strlen(tech_pvt->skype_call_id)
</span><span class="cx">                                                                 || !strcasecmp(tech_pvt->skype_call_id, id)) {
</span><span class="cx">                                                                 skypiax_strncpy(tech_pvt->skype_call_id, id, sizeof(tech_pvt->skype_call_id) - 1);
</span><del>-                                                                tech_pvt->skype_callflow = CALLFLOW_STATUS_INPROGRESS;
</del><span class="cx">                                                                 DEBUGA_SKYPE("skype_call: %s is now active\n", SKYPIAX_P_LOG, id);
</span><span class="cx">
</span><span class="cx">                                                                 if (tech_pvt->skype_callflow != CALLFLOW_STATUS_EARLYMEDIA) {
</span><ins>+                                                                        tech_pvt->skype_callflow = CALLFLOW_STATUS_INPROGRESS;
</ins><span class="cx">                                                                         tech_pvt->interface_state = SKYPIAX_STATE_UP;
</span><span class="cx">
</span><del>-                                                                        if (start_audio_threads(tech_pvt)) {
-                                                                                ERRORA("start_audio_threads FAILED\n", SKYPIAX_P_LOG);
-                                                                                return CALLFLOW_INCOMING_HANGUP;
</del><ins>+                                                                        if(tech_pvt->tcp_cli_thread == NULL){
+                                                                                DEBUGA_SKYPE("START start_audio_threads\n", SKYPIAX_P_LOG);
+                                                                                if (start_audio_threads(tech_pvt)) {
+                                                                                        ERRORA("start_audio_threads FAILED\n", SKYPIAX_P_LOG);
+                                                                                        return CALLFLOW_INCOMING_HANGUP;
+                                                                                }
</ins><span class="cx">                                                                         }
</span><span class="cx">                                                                         skypiax_sleep(1000);        //FIXME
</span><span class="cx">                                                                         sprintf(msg_to_skype, "ALTER CALL %s SET_INPUT PORT=\"%d\"", id, tech_pvt->tcp_cli_port);
</span><span class="lines">@@ -422,6 +428,7 @@
</span><span class="cx">                                                                         sprintf(msg_to_skype, "#output ALTER CALL %s SET_OUTPUT PORT=\"%d\"", id, tech_pvt->tcp_srv_port);
</span><span class="cx">                                                                         skypiax_signaling_write(tech_pvt, msg_to_skype);
</span><span class="cx">                                                                 }
</span><ins>+                                                                tech_pvt->skype_callflow = CALLFLOW_STATUS_INPROGRESS;
</ins><span class="cx">                                                                 if (!strlen(tech_pvt->session_uuid_str)) {
</span><span class="cx">                                                                         DEBUGA_SKYPE("New Inbound Channel!\n\n\n\n", SKYPIAX_P_LOG);
</span><span class="cx">                                                                         new_inbound_channel(tech_pvt);
</span><span class="lines">@@ -550,7 +557,7 @@
</span><span class="cx">
</span><span class="cx"> /****************************/
</span><span class="cx">
</span><del>-                        while ((fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) {
</del><ins>+                        while (s > 0 && (fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) {
</ins><span class="cx">                                 DEBUGA_SKYPE("ACCEPTED here I send you %d\n", SKYPIAX_P_LOG, tech_pvt->tcp_srv_port);
</span><span class="cx">                                 if (!(running && tech_pvt->running))
</span><span class="cx">                                         break;
</span><span class="lines">@@ -655,15 +662,13 @@
</span><span class="cx">
</span><span class="cx">                                 DEBUGA_SKYPE("Skype incoming audio GONE\n", SKYPIAX_P_LOG);
</span><span class="cx">                                 skypiax_close_socket(fd);
</span><del>-                                //if (exit)
-                                break;
</del><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         DEBUGA_SKYPE("incoming audio server (I am it) EXITING\n", SKYPIAX_P_LOG);
</span><span class="cx">         skypiax_close_socket(s);
</span><del>-        tech_pvt->tcp_srv_thread = NULL;
</del><ins>+        s=-1;
</ins><span class="cx">         return NULL;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -725,7 +730,7 @@
</span><span class="cx">
</span><span class="cx"> /****************************/
</span><span class="cx">
</span><del>-                        while ((fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) {
</del><ins>+                        while (s > 0 && (fd = accept(s, (struct sockaddr *) &remote_addr, &sin_size)) > 0) {
</ins><span class="cx">                                 DEBUGA_SKYPE("ACCEPTED here you send me %d\n", SKYPIAX_P_LOG, tech_pvt->tcp_cli_port);
</span><span class="cx"> #ifndef WIN32
</span><span class="cx">                                 fcntl(tech_pvt->audioskypepipe[0], F_SETFL, O_NONBLOCK);
</span><span class="lines">@@ -836,14 +841,13 @@
</span><span class="cx">                                 }
</span><span class="cx">                                 DEBUGA_SKYPE("Skype outbound audio GONE\n", SKYPIAX_P_LOG);
</span><span class="cx">                                 skypiax_close_socket(fd);
</span><del>-                                break;
</del><span class="cx">                         }
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         DEBUGA_SKYPE("outbound audio server (I am it) EXITING\n", SKYPIAX_P_LOG);
</span><span class="cx">         skypiax_close_socket(s);
</span><del>-        tech_pvt->tcp_cli_thread = NULL;
</del><ins>+        s=-1;
</ins><span class="cx">         return NULL;
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -949,8 +953,12 @@
</span><span class="cx">
</span><span class="cx"> int skypiax_pipe_write(int pipe, short *buf, int howmany)
</span><span class="cx"> {
</span><del>-        howmany = write(pipe, buf, howmany);
-        return howmany;
</del><ins>+        if(buf){
+                howmany = write(pipe, buf, howmany);
+                return howmany;
+        } else {
+                return 0;
+        }
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> int skypiax_close_socket(unsigned int fd)
</span><span class="lines">@@ -1452,6 +1460,8 @@
</span><span class="cx">                 if (!skypiax_send_message(SkypiaxHandles, buf)) {
</span><span class="cx">                         ERRORA("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch Skypiax again\n", SKYPIAX_P_LOG);
</span><span class="cx">                         running = 0;
</span><ins>+                        if(disp)
+                                XCloseDisplay(disp);
</ins><span class="cx">                         return NULL;
</span><span class="cx">                 }
</span><span class="cx">
</span><span class="lines">@@ -1459,6 +1469,8 @@
</span><span class="cx">                 if (!skypiax_send_message(SkypiaxHandles, buf)) {
</span><span class="cx">                         ERRORA("Sending message failed - probably Skype crashed. Please run/restart Skype manually and launch Skypiax again\n", SKYPIAX_P_LOG);
</span><span class="cx">                         running = 0;
</span><ins>+                        if(disp)
+                                XCloseDisplay(disp);
</ins><span class="cx">                         return NULL;
</span><span class="cx">                 }
</span><span class="cx">
</span><span class="lines">@@ -1472,6 +1484,7 @@
</span><span class="cx">                 Atom atom_begin = XInternAtom(disp, "SKYPECONTROLAPI_MESSAGE_BEGIN", False);
</span><span class="cx">                 Atom atom_continue = XInternAtom(disp, "SKYPECONTROLAPI_MESSAGE", False);
</span><span class="cx">
</span><ins>+                memset(buffer, '\0', 17000);
</ins><span class="cx">                 b = buffer;
</span><span class="cx">
</span><span class="cx">                 while (1) {
</span><span class="lines">@@ -1539,9 +1552,13 @@
</span><span class="cx">         } else {
</span><span class="cx">                 ERRORA("Skype is not running, maybe crashed. Please run/restart Skype and relaunch Skypiax\n", SKYPIAX_P_LOG);
</span><span class="cx">                 running = 0;
</span><ins>+                if(disp)
+                        XCloseDisplay(disp);
</ins><span class="cx">                 return NULL;
</span><span class="cx">         }
</span><span class="cx">         //running = 0;
</span><ins>+        if(disp)
+                XCloseDisplay(disp);
</ins><span class="cx">         return NULL;
</span><span class="cx">
</span><span class="cx"> }
</span></span></pre>
</div>
</div>
<div id="footer">See you at ClueCon</div>
</body>
</html>