]> mj.ucw.cz Git - libucw.git/commitdiff
Main: Add main_step()
authorMartin Mares <mj@ucw.cz>
Tue, 1 Mar 2011 13:07:51 +0000 (14:07 +0100)
committerMartin Mares <mj@ucw.cz>
Tue, 1 Mar 2011 13:07:51 +0000 (14:07 +0100)
ucw/mainloop.c
ucw/mainloop.h

index 1d213c03bb7416491e648b9da5a21aec486fc8e9..7eb8c8acdf35fe59861dc0fccb76a0a6ac0b9971 100644 (file)
@@ -787,10 +787,15 @@ main_loop(void)
          break;
        default: ;
        }
-      if (count_timers(m))
-       wake = MIN(wake, m->timer_table[1]->expires);
-      main_get_time_ctx(m);
-      int timeout = ((wake > m->now) ? wake - m->now : 0);
+
+      int timeout = 0;
+      if (!m->single_step)
+       {
+         if (count_timers(m))
+           wake = MIN(wake, m->timer_table[1]->expires);
+         main_get_time_ctx(m);
+         timeout = ((wake > m->now) ? wake - m->now : 0);
+       }
 
 #ifdef CONFIG_UCW_EPOLL
       recalc_files(m);
@@ -811,7 +816,12 @@ main_loop(void)
       m->idle_time += m->now - old_now;
 
       if (n <= 0)
-       continue;
+       {
+         if (m->single_step)
+           return;
+         else
+           continue;
+       }
 
       // Relink all files with a pending event to file_active_list
 #ifdef CONFIG_UCW_EPOLL
@@ -867,3 +877,12 @@ main_loop(void)
        }
     }
 }
+
+void
+main_step(void)
+{
+  struct main_context *m = main_current();
+  m->single_step = 1;
+  main_loop();
+  m->single_step = 0;
+}
index a1d4e24de000d639b229ae9d2ddbf8d84bdf8891..ae1c1e4a65600f44c4ad01d8c28c8f2c9f58fa15 100644 (file)
 
 /** The main loop context **/
 struct main_context {
-  timestamp_t now;                     /* [*] Current time in milliseconds since the UNIX epoch. See @main_get_time(). */
+  timestamp_t now;                     /* [*] Current time in milliseconds since the UNIX epoch. See main_get_time(). */
   ucw_time_t now_seconds;              /* [*] Current time in seconds since the epoch. */
   timestamp_t idle_time;               /* [*] Total time in milliseconds spent by waiting for events. */
-  uns shutdown;                                /* [*] Setting this to nonzero forces the @main_loop() function to terminate. */
+  uns shutdown;                                /* [*] Setting this to nonzero forces the main_loop() function to terminate. */
   clist file_list;
   clist file_active_list;
   clist hook_list;
@@ -35,6 +35,7 @@ struct main_context {
   clist process_list;
   clist signal_list;
   uns file_cnt;
+  uns single_step;
 #ifdef CONFIG_UCW_EPOLL
   int epoll_fd;                                /* File descriptor used for epoll */
   struct epoll_event *epoll_events;
@@ -95,6 +96,13 @@ void main_teardown(void);
  **/
 void main_loop(void);
 
+/**
+ * Perform a single iteration of the main loop.
+ * Check if there are any events ready and process them.
+ * If there are none, do not wait.
+ **/
+void main_step(void);
+
 /** Ask the main loop to terminate at the nearest occasion. **/
 static inline void main_shut_down(void)
 {