]> mj.ucw.cz Git - libucw.git/blobdiff - lib/mainloop.h
Implemented bfix_tmp_file(), which turns a temporary file fastbuf
[libucw.git] / lib / mainloop.h
index 3cddb4185a73921b29ed0d0bd57a4784c6329e94..5c3baf68c226f42b460b4a18f192f89007d26ffd 100644 (file)
@@ -1,16 +1,21 @@
 /*
- *     Sherlock Library -- Main Loop
+ *     UCW Library -- Main Loop
  *
- *     (c) 2004 Martin Mares <mj@ucw.cz>
+ *     (c) 2004--2005 Martin Mares <mj@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
  */
 
+#ifndef _UCW_MAINLOOP_H
+#define _UCW_MAINLOOP_H
+
 #include "lib/clists.h"
 
-extern sh_time_t now;                          /* Current time */
+extern timestamp_t main_now;                   /* Current time in milliseconds since UNIX epoch */
+extern sh_time_t main_now_seconds;             /* Current time in seconds since the epoch */
 extern uns main_shutdown;
+extern clist main_timer_list, main_file_list, main_hook_list, main_process_list;
 
 /* User-defined fields are marked with [*], all other fields must be initialized to zero. */
 
@@ -18,14 +23,16 @@ extern uns main_shutdown;
 
 struct main_timer {
   cnode n;
-  sh_time_t expires;
+  timestamp_t expires;
   void (*handler)(struct main_timer *tm);      /* [*] Function to be called when the timer expires. Must re-add/del the timer.*/
   void *data;                                  /* [*] Data for use by the handler */
 };
 
-void timer_add(struct main_timer *tm, sh_time_t expires);      /* Can modify a running timer, too */
+void timer_add(struct main_timer *tm, timestamp_t expires);    /* Can modify a running timer, too */
 void timer_del(struct main_timer *tm);
 
+void main_get_time(void);                      /* Refresh main_now */
+
 /* Files to poll */
 
 struct main_file {
@@ -56,16 +63,24 @@ void file_chg(struct main_file *fi);
 void file_del(struct main_file *fi);
 void file_read(struct main_file *fi, void *buf, uns len);
 void file_write(struct main_file *fi, void *buf, uns len);
-void file_set_timeout(struct main_file *fi, sh_time_t expires);
+void file_set_timeout(struct main_file *fi, timestamp_t expires);
+void file_close_all(void);                     /* Close all known main_file's; frequently used before fork() */
 
 /* Hooks to be called in each iteration of the main loop */
 
 struct main_hook {
   cnode n;
-  int (*handler)(struct main_hook *ho);                /* [*] Hook function; returns 1 if should be called again */
+  int (*handler)(struct main_hook *ho);                /* [*] Hook function; returns HOOK_xxx */
   void *data;                                  /* [*] For use by the handler */
 };
 
+enum main_hook_return {
+  HOOK_IDLE,                                   /* Call again when the main loop becomes idle again */
+  HOOK_RETRY,                                  /* Call again as soon as possible */
+  HOOK_DONE = -1,                              /* Shut down the main loop if all hooks return this value */
+  HOOK_SHUTDOWN = -2                           /* Shut down the main loop immediately */
+};
+
 void hook_add(struct main_hook *ho);
 void hook_del(struct main_hook *ho);
 
@@ -73,8 +88,9 @@ void hook_del(struct main_hook *ho);
 
 struct main_process {
   cnode n;
-  int pid;
-  int status;                                  /* Exit status */
+  int pid;                                     /* Process id (0=not running) */
+  int status;                                  /* Exit status (-1=fork failed) */
+  char status_msg[EXIT_STATUS_MSG_SIZE];
   void (*handler)(struct main_process *mp);    /* [*] Called when the process exits; process_del done automatically */
   void *data;                                  /* [*] For use by the handler */
 };
@@ -88,3 +104,5 @@ int process_fork(struct main_process *mp);
 void main_init(void);
 void main_loop(void);
 void main_debug(void);
+
+#endif