]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix hunting of zchan on incoming calls and event reading bug
authorMoises Silva <moy@sangoma.com>
Wed, 25 Nov 2009 20:18:29 +0000 (20:18 +0000)
committerMoises Silva <moy@sangoma.com>
Wed, 25 Nov 2009 20:18:29 +0000 (20:18 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/branches/sangoma_boost@904 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/freetdm/src/ozmod/ozmod_sangoma_boost/ozmod_sangoma_boost.c
libs/freetdm/src/ozmod/ozmod_sangoma_boost/sangoma_boost_client.c

index 351e2b65c2c4e1a5507377364535c7a6cad9ff27..7cbcf98a7a931ec29169496740d510b7b9f73ab4 100644 (file)
@@ -191,10 +191,18 @@ static zap_channel_t *find_zchan(zap_span_t *span, sangomabc_short_event_t *even
 {
        int i;
        zap_channel_t *zchan = NULL;
+       zap_sangoma_boost_data_t *sangoma_boost_data = span->signal_data;
+       int targetspan = event->span+1;
+       int targetchan = event->chan+1;
+       if (sangoma_boost_data->sigmod) {
+               /* span is not strictly needed here since we're supposed to get only events for our span */
+               targetspan = event->span;
+               targetchan = event->chan;
+       }
 
        zap_mutex_lock(signal_mutex);
        for(i = 1; i <= span->chan_count; i++) {
-               if (span->channels[i]->physical_span_id == event->span+1 && span->channels[i]->physical_chan_id == event->chan+1) {
+               if (span->channels[i]->physical_span_id == targetspan && span->channels[i]->physical_chan_id == targetchan) {
                        zchan = span->channels[i];
                        if (force || (zchan->state == ZAP_CHANNEL_STATE_DOWN && !zap_test_flag(zchan, ZAP_CHANNEL_INUSE))) {
                                break;
@@ -1549,7 +1557,7 @@ static BOOST_WRITE_MSG_FUNCTION(zap_boost_write_msg)
        if (!element) {
                return ZAP_FAIL;
        }
-       memcpy(&element->boostmsg, msg, msglen);
+       memcpy(element->boostmsg, msg, msglen);
        element->size = msglen;
 
        sangoma_boost_data = span->signal_data;
index 43b159ff75f56f568f4ab3d6d0864c6275736220..89e90d39cbd9349adea53ff8337b84dc56023655 100644 (file)
@@ -277,9 +277,11 @@ sangomabc_event_t *__sangomabc_connection_read(sangomabc_connection_t *mcon, int
 
        if (mcon->sigmod) {
                e = zap_queue_dequeue(mcon->boost_queue);
-               bytes = e->size;
-               memcpy(&mcon->event, e->boostmsg, bytes);
-               zap_safe_free(e);
+               if (e) {
+                       bytes = e->size;
+                       memcpy(&mcon->event, e->boostmsg, bytes);
+                       zap_safe_free(e);
+               }
        } else {
                bytes = recvfrom(mcon->socket, &mcon->event, sizeof(mcon->event), MSG_DONTWAIT, 
                                                 (struct sockaddr *) &mcon->local_addr, &fromlen);
@@ -364,15 +366,10 @@ sangomabc_event_t *__sangomabc_connection_readp(sangomabc_connection_t *mcon, in
 {
        unsigned int fromlen = sizeof(struct sockaddr_in);
        int bytes = 0;
-       sangomabc_queue_element_t *e = NULL;
 
        if (mcon->sigmod) {
-               e = zap_queue_dequeue(mcon->boost_queue);
-               if (e) {
-                       bytes = e->size;
-                       memcpy(&mcon->event, e->boostmsg, bytes);
-                       zap_safe_free(e);
-               }
+               /* priority stuff is handled just the same when there is a sigmod */
+               return sangomabc_connection_read(mcon, iteration);
        } else {
                bytes = recvfrom(mcon->socket, &mcon->event, sizeof(mcon->event), MSG_DONTWAIT, (struct sockaddr *) &mcon->local_addr, &fromlen);
        }