removed some usleep debugging, so audioprocessing will not hang
[lcr.git] / main.c
diff --git a/main.c b/main.c
index 3d905d0..3481245 100644 (file)
--- a/main.c
+++ b/main.c
@@ -28,7 +28,7 @@
 
 MESSAGES
 
-double now_d;
+double now_d, last_d;
 time_t now;
 struct tm *now_tm;
 struct timeval now_tv;
@@ -40,11 +40,14 @@ struct timezone now_tz;
                now = now_tv.tv_sec; \
                now_tm = localtime(&now); \
        }
-//#define DEBUG_DURATION
 
 int global_debug = 0;
 int quit=0;
 
+#if 0
+struct lcr_fdset lcr_fdset[FD_SETSIZE];
+#endif
+
 pthread_mutex_t mutexd; // debug output mutex
 //pthread_mutex_t mutext; // trace output mutex
 pthread_mutex_t mutexe; // error output mutex
@@ -66,6 +69,11 @@ int last_debug = 0;
 int debug_newline = 1;
 int nooutput = 0;
 
+void debug_usleep(int msec, char *file, int line, int hour, int min, int sec)
+{
+       usleep(msec);
+}
+
 void debug(const char *function, int line, char *prefix, char *buffer)
 {
        /* if we have a new debug count, we add a mark */
@@ -185,7 +193,7 @@ int main(int argc, char *argv[])
        struct message          *message;
        class Port              *port;
        class Endpoint          *epoint;
-       class Call              *call;
+       class Join              *join;
        int                     i;
        int                     all_idle;
        char                    prefix_string[64];
@@ -193,15 +201,14 @@ int main(int argc, char *argv[])
        char                    *debug_prefix = "alloc";
        int                     created_mutexd = 0,/* created_mutext = 0,*/ created_mutexe = 0,
                                created_lock = 0, created_signal = 0, created_debug = 0;
-#ifdef DEBUG_DURATION
-       time_t                  durationupdate;
-       double                  idle_duration, isdn_duration, port_duration, epoint_duration, call_duration, message_duration, admin_duration;
-       double                  start_d;
-#endif
        int                     idletime = 0, idlecheck = 0;
-       char                    debug_log[128];
        char                    tracetext[256];
 
+#if 0
+       /* init fdset */
+       memset(lcr_fdset, 0, sizeof(lcr_fdset));
+#endif
+
        /* current time */
        GET_NOW();
 
@@ -222,7 +229,7 @@ int main(int argc, char *argv[])
                printf("rules [action] = Get individual help for given action.\n");
 //             printf("route = Show current routing as it is parsed.\n");
                printf("\n");
-               ret = 0;
+               ret = 999;
                goto free;
        }
 
@@ -287,22 +294,11 @@ int main(int argc, char *argv[])
        if (read_options() == 0)
                goto free;
 
-       /* initialize stuff of the NT lib */
-       if (options.deb & DEBUG_STACK)
-       {
-               global_debug = 0xffffffff & ~DBGM_MSG;
-//             global_debug = DBGM_L3DATA;
-       } else
-               global_debug = DBGM_MAN;
-       SPRINT(debug_log, "%s/debug.log", INSTALL_DATA);
-       if (options.deb & DEBUG_LOG)
-               debug_init(global_debug, debug_log, debug_log, debug_log);
-       else
-               debug_init(global_debug, NULL, NULL, NULL);
+       /* init mISDN */
+       if (mISDN_initialize() < 0)
+               goto free;
        created_debug = 1;
 
-       msg_init();
-
        /* read ruleset(s) */
        if (!(ruleset_first = ruleset_parse()))
                goto free;
@@ -464,26 +460,28 @@ int main(int argc, char *argv[])
        printf("%s\n", tracetext);
        end_trace();
        GET_NOW();
-#ifdef DEBUG_DURATION
-       start_d = now_d;
-       durationupdate = now;
-       idle_duration = isdn_duration = port_duration = epoint_duration = call_duration = message_duration = admin_duration = 0;
-#endif
        quit = 0;
        while(!quit)
        {
+               last_d = now_d;
+               GET_NOW();
+               if (now_d-last_d > 1.0)
+               {
+                       PERROR("LCR was stalling %d.%d seconds\n", ((int)((now_d-last_d)*10.0))/10, (int)((now_d-last_d)*10.0));
+               }
                /* all loops must be counted from the beginning since nodes might get freed during handler */
                all_idle = 1;
 
+//#warning debugging usleep crash
+//             debug_usleep(1, __FILE__, __LINE__, now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec);
+
                /* handle mISDN messages from kernel */
                debug_prefix = "ISDN";
                if (mISDN_handler())
                        all_idle = 0;
-#ifdef DEBUG_DURATION
-               GET_NOW();
-               isdn_duration += (now_d - start_d);
-               start_d = now_d;
-#endif
+//#warning debugging usleep crash
+//             debug_usleep(1, __FILE__, __LINE__, now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec);
+
 BUDETECT
 
                /* loop through all port ports and call their handler */
@@ -500,11 +498,6 @@ BUDETECT
                                goto port_again;
                        port = port->next;
                }
-#ifdef DEBUG_DURATION
-               GET_NOW();
-               port_duration += (now_d - start_d);
-               start_d = now_d;
-#endif
 
                /* loop through all epoint and call their handler */
                epoint_again:
@@ -521,31 +514,21 @@ BUDETECT
                                goto epoint_again;
                        epoint = epoint->next;
                }
-#ifdef DEBUG_DURATION
-               GET_NOW();
-               epoint_duration += (now_d - start_d);
-               start_d = now_d;
-#endif
 
-               /* loop through all calls and call their handler */
-               call_again:
-               call = call_first;
-               while(call)
+               /* loop through all joins and call their handler */
+               join_again:
+               join = join_first;
+               while(join)
                {
-                       debug_prefix = "call";
+                       debug_prefix = "join";
                        debug_count++;
-                       ret = call->handler();
+                       ret = join->handler();
                        if (ret)
                                all_idle = 0;
-                       if (ret < 0) /* call has been destroyed */
-                               goto call_again;
-                       call = call->next;
+                       if (ret < 0) /* join has been destroyed */
+                               goto join_again;
+                       join = join->next;
                }
-#ifdef DEBUG_DURATION
-               GET_NOW();
-               call_duration += (now_d - start_d);
-               start_d = now_d;
-#endif
 
                debug_prefix = 0;
 
@@ -575,33 +558,33 @@ BUDETECT
                                }
                                break;
 
-                               case EPOINT_TO_CALL:
-                               debug_prefix = "msg epoint->call";
-                               call = find_call_id(message->id_to);
-                               if (call)
+                               case EPOINT_TO_JOIN:
+                               debug_prefix = "msg epoint->join";
+                               join = find_join_id(message->id_to);
+                               if (join)
                                {
-                                       call->message_epoint(message->id_from, message->type, &message->param);
+                                       join->message_epoint(message->id_from, message->type, &message->param);
                                } else
                                {
-                                       PDEBUG(DEBUG_MSG, "Warning: message %s from endpoint %d to call %d. call doesn't exist anymore\n", messages_txt[message->type], message->id_from, message->id_to);
+                                       PDEBUG(DEBUG_MSG, "Warning: message %s from endpoint %d to join %d. join doesn't exist anymore\n", messages_txt[message->type], message->id_from, message->id_to);
                                }
                                break;
 
-                               case CALL_TO_EPOINT:
-                               debug_prefix = "msg call->epoint";
+                               case JOIN_TO_EPOINT:
+                               debug_prefix = "msg join->epoint";
                                epoint = find_epoint_id(message->id_to);
                                if (epoint)
                                {
                                        if (epoint->ep_app)
                                        {
-                                               epoint->ep_app->ea_message_call(message->id_from, message->type, &message->param);
+                                               epoint->ep_app->ea_message_join(message->id_from, message->type, &message->param);
                                        } else
                                        {
-                                               PDEBUG(DEBUG_MSG, "Warning: message %s from call %d to endpoint %d. endpoint doesn't have an application.\n", messages_txt[message->type], message->id_from, message->id_to);
+                                               PDEBUG(DEBUG_MSG, "Warning: message %s from join %d to endpoint %d. endpoint doesn't have an application.\n", messages_txt[message->type], message->id_from, message->id_to);
                                        }
                                } else
                                {
-                                       PDEBUG(DEBUG_MSG, "Warning: message %s from call %d to endpoint %d. endpoint doesn't exist anymore.\n", messages_txt[message->type], message->id_from, message->id_to);
+                                       PDEBUG(DEBUG_MSG, "Warning: message %s from join %d to endpoint %d. endpoint doesn't exist anymore.\n", messages_txt[message->type], message->id_from, message->id_to);
                                }
                                break;
 
@@ -625,21 +608,11 @@ BUDETECT
                        debug_count++;
                        debug_prefix = "message";
                }
-#ifdef DEBUG_DURATION
-               GET_NOW();
-               message_duration += (now_d - start_d);
-               start_d = now_d;
-#endif
 BUDETECT
 
                /* handle socket */
                if (admin_handle())
                        all_idle = 0;
-#ifdef DEBUG_DURATION
-               GET_NOW();
-               admin_duration += (now_d - start_d);
-               start_d = now_d;
-#endif
 BUDETECT
 
 #if 0
@@ -650,6 +623,8 @@ BUDETECT
                        all_idle = 0;
                }
 #endif
+//#warning debugging usleep crash
+//             debug_usleep(1, __FILE__, __LINE__, now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec);
 
                /* do idle checking */
                if (idlecheck != now)
@@ -658,35 +633,20 @@ BUDETECT
                        idletime = 0;
                        idlecheck = now;
                }
-#ifdef DEBUG_DURATION
-               GET_NOW();
-               idle_duration += (now_d - start_d);
-               start_d = now_d;
-               if (durationupdate != now)
-               {
-                       durationupdate = now;
-                       printf("Idle:%3d ISDN:%3d Port:%3d Epoint:%3d Call:%3d Message:%3d Admin:%3d\n",
-                               (int)(idle_duration*100),
-                               (int)(isdn_duration*100),
-                               (int)(port_duration*100),
-                               (int)(epoint_duration*100),
-                               (int)(call_duration*100),
-                               (int)(message_duration*100),
-                               (int)(admin_duration*100));
-                       idle_duration = isdn_duration = port_duration = epoint_duration = call_duration = message_duration = admin_duration = 0;
-               }
-#else
-               GET_NOW();
-#endif
 
                /* did we do nothing? so we wait to give time to other processes */
                if (all_idle)
                {
-                       usleep(4000); /* wait 32 samples */
+                       debug_usleep(4000, __FILE__, __LINE__, now_tm->tm_hour, now_tm->tm_min, now_tm->tm_sec);
                        idletime += 4000;
                }
        }
-       printf("LCR terminated\n");
+       SPRINT(tracetext, "%s terminated", NAME);
+       printf("%s\n", tracetext);
+       start_trace(0, NULL, NULL, NULL, 0, 0, 0, tracetext);
+       if (ret)
+               add_trace("error", NULL, "%d", ret);
+       end_trace();
        ret=0;
 
        /* free all */
@@ -725,7 +685,7 @@ free:
        }
        epoint_first = NULL;
        debug_count++;
-       call_free();
+       join_free();
 
        /* free interfaces */
        if (interface_first)
@@ -777,9 +737,8 @@ free:
                if (pthread_mutex_destroy(&mutexd))
                        fprintf(stderr, "cannot destroy 'PDEBUG' mutex\n");
 
-       /* close debug */
-       if (created_debug)
-               debug_close();
+       /* deinitialize mISDN */
+       mISDN_deinitialize();
        global_debug = 0;
 
        /* display memory leak */
@@ -796,9 +755,9 @@ free:
                ret = -1; \
        }
        MEMCHECK("",memuse)
-       MEMCHECK("memory block(s) left (port.cpp)",pmemuse)
-       MEMCHECK("memory block(s) left (epoint.cpp)",ememuse)
-       MEMCHECK("memory block(s) left (call.cpp)",cmemuse)
+       MEMCHECK("memory block(s) left (port.cpp ...)",pmemuse)
+       MEMCHECK("memory block(s) left (epoint*.cpp ...)",ememuse)
+       MEMCHECK("memory block(s) left (join*.cpp)",cmemuse)
        MEMCHECK("memory block(s) left (message.c)",mmemuse)
        MEMCHECK("memory block(s) left (route.c)",rmemuse)
        MEMCHECK("memory block(s) left (args)",amemuse)
@@ -807,12 +766,6 @@ free:
        MEMCHECK("file handler(s) left",fhuse)
 
        /* take me out */
-       SPRINT(tracetext, "%s exit", NAME);
-       printf("%s\n", tracetext);
-       start_trace(0, NULL, NULL, NULL, 0, 0, 0, tracetext);
-       if (ret)
-               add_trace("error", NULL, "%d", ret);
-       end_trace();
        return(ret);
 }