]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
refactor sonar, remove global vars so it can run multiple sonar at a time
authorSeven Du <dujinfang@gmail.com>
Thu, 26 Sep 2013 22:13:05 +0000 (06:13 +0800)
committerSeven Du <dujinfang@gmail.com>
Thu, 26 Sep 2013 22:13:05 +0000 (06:13 +0800)
src/mod/applications/mod_sonar/mod_sonar.c

index f332f7cae2e31ab731f68dbdf715c8d062942ce8..2a338282f9f787e63b3800a1a3255539b9c933ef 100644 (file)
@@ -58,27 +58,38 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_sonar_load);
  */
 SWITCH_MODULE_DEFINITION(mod_sonar, mod_sonar_load, mod_sonar_shutdown, NULL);
 
-switch_time_t start, end, diff;
-int samples[1024];
-int received;
-int sum, min, max = 0;
+
+struct sonar_ping_helper_s {
+       switch_time_t start, end, diff;
+       int samples[1024];
+       int received;
+       int sum, min, max;
+};
+
+typedef struct sonar_ping_helper_s sonar_ping_helper_t;
 
 switch_bool_t sonar_ping_callback(switch_core_session_t *session, const char *app, const char *app_data){
-       
-       if ( end ) {
+       switch_channel_t *channel = switch_core_session_get_channel(session);
+       sonar_ping_helper_t *ph = switch_channel_get_private(channel, "__sonar_ping__");
+       int diff;
+
+       if (!ph) return SWITCH_TRUE;
+
+       if ( ph->end ) {
                return SWITCH_TRUE;
        }
-       end = switch_time_now();
-       diff = end - start;
 
-       start = 0;
+       ph->end = switch_time_now();
+       diff = ph->end - ph->start;
+
+       ph->start = 0;
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, "Sonar ping took %ld milliseconds\n", (long)diff / 1000);
 
        diff /= 1000;
-       sum += diff;
-       max = MAX(max, diff);
-       min = MIN(min, diff);
-       samples[received++] = diff;
+       ph->sum += diff;
+       ph->max = MAX(ph->max, diff);
+       ph->min = MIN(ph->min, diff);
+       ph->samples[ph->received++] = diff;
        
        return SWITCH_TRUE;
 }
@@ -92,7 +103,9 @@ SWITCH_STANDARD_APP(sonar_app)
        int lost = 0;
        int x;
        int avg = 0, mdev = 0;
+       int sum2;
        switch_event_t *event;
+       sonar_ping_helper_t ph = { 0 };
 
        if (zstr(arg)) {
                loops = 5;
@@ -108,7 +121,8 @@ SWITCH_STANDARD_APP(sonar_app)
        
        switch_channel_answer(channel);
        switch_ivr_sleep(session, 1000, SWITCH_FALSE, NULL);
-       
+       switch_channel_set_private(channel, "__sonar_ping__", &ph);
+
        switch_ivr_tone_detect_session(session, 
                                                                   "ping", "1004",
                                                                   "r", 0, 
@@ -116,13 +130,13 @@ SWITCH_STANDARD_APP(sonar_app)
        
        switch_ivr_sleep(session, 1000, SWITCH_FALSE, NULL);
 
-       received = 0; sum = 0; max = 0; min = 999999;
+       ph.min = 999999;
        for( x = 0; x < loops; x++ ) {
-               end = 0;
-               start = switch_time_now();
+               ph.end = 0;
+               ph.start = switch_time_now();
                switch_ivr_gentones(session, tone, 1, NULL);
                switch_ivr_sleep(session, 2000, SWITCH_FALSE, NULL);
-               if ( start ) {
+               if ( ph.start ) {
                        lost++;
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Lost sonar ping\n");
                }
@@ -136,32 +150,32 @@ SWITCH_STANDARD_APP(sonar_app)
                return;
        }
 
-       if (received + lost != loops) {
-               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Race happend %d + %d != %d\n", received, lost, loops);
+       if (ph.received + lost != loops) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Race happend %d + %d != %d\n", ph.received, lost, loops);
        }
 
-       if (received > 0) avg = sum / received;
+       if (ph.received > 0) avg = ph.sum / ph.received;
 
-       sum = 0;
-       for(x = 0; x < received; x++) {
-               sum += (samples[x] - avg) * (samples[x] - avg);
+       sum2 = 0;
+       for(x = 0; x < ph.received; x++) {
+               sum2 += (ph.samples[x] - avg) * (ph.samples[x] - avg);
        }
 
-       if (received > 1) {
-               mdev = sqrt(sum / (received - 1));
+       if (ph.received > 1) {
+               mdev = sqrt(sum2 / (ph.received - 1));
        }
 
        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,
                "Sonar Ping (in ms): min:%d max:%d avg:%d mdev:%d sent:%d recv: %d lost:%d lost/send:%2.2f%%\n",
-               min, max, avg, mdev, loops, received, lost, lost * 1.0 / loops);
+               ph.min, ph.max, avg, mdev, loops, ph.received, lost, lost * 1.0 / loops);
 
        if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, "sonar::ping") == SWITCH_STATUS_SUCCESS) {
-               switch_event_add_header(event, SWITCH_STACK_BOTTOM, "ping_min", "%d", min);
-               switch_event_add_header(event, SWITCH_STACK_BOTTOM, "ping_max", "%d", max);
+               switch_event_add_header(event, SWITCH_STACK_BOTTOM, "ping_min", "%d", ph.min);
+               switch_event_add_header(event, SWITCH_STACK_BOTTOM, "ping_max", "%d", ph.max);
                switch_event_add_header(event, SWITCH_STACK_BOTTOM, "ping_avg", "%d", avg);
                switch_event_add_header(event, SWITCH_STACK_BOTTOM, "ping_mdev", "%d", mdev);
                switch_event_add_header(event, SWITCH_STACK_BOTTOM, "ping_sent", "%d", loops);
-               switch_event_add_header(event, SWITCH_STACK_BOTTOM, "ping_recv", "%d", received);
+               switch_event_add_header(event, SWITCH_STACK_BOTTOM, "ping_recv", "%d", ph.received);
                switch_event_add_header(event, SWITCH_STACK_BOTTOM, "ping_lost", "%d", lost);
                switch_event_add_header(event, SWITCH_STACK_BOTTOM, "lost_rate", "%2.2f%%", lost * 1.0 / loops);
                switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "destination_number",