]> mj.ucw.cz Git - libucw.git/blob - lib/mainloop.h
Merge with git+ssh://git.ucw.cz/projects/sherlock/GIT/sherlock.git
[libucw.git] / lib / mainloop.h
1 /*
2  *      UCW Library -- Main Loop
3  *
4  *      (c) 2004--2005 Martin Mares <mj@ucw.cz>
5  *
6  *      This software may be freely distributed and used according to the terms
7  *      of the GNU Lesser General Public License.
8  */
9
10 #ifndef _UCW_MAINLOOP_H
11 #define _UCW_MAINLOOP_H
12
13 #include "lib/clists.h"
14
15 extern timestamp_t main_now;                    /* Current time in milliseconds since UNIX epoch */
16 extern sh_time_t main_now_seconds;              /* Current time in seconds since the epoch */
17 extern uns main_shutdown;
18 extern clist main_timer_list, main_file_list, main_hook_list, main_process_list;
19
20 /* User-defined fields are marked with [*], all other fields must be initialized to zero. */
21
22 /* Timers */
23
24 struct main_timer {
25   cnode n;
26   timestamp_t expires;
27   void (*handler)(struct main_timer *tm);       /* [*] Function to be called when the timer expires. Must re-add/del the timer.*/
28   void *data;                                   /* [*] Data for use by the handler */
29 };
30
31 void timer_add(struct main_timer *tm, timestamp_t expires);     /* Can modify a running timer, too */
32 void timer_del(struct main_timer *tm);
33
34 void main_get_time(void);                       /* Refresh main_now */
35
36 /* Files to poll */
37
38 struct main_file {
39   cnode n;
40   int fd;                                       /* [*] File descriptor */
41   int (*read_handler)(struct main_file *fi);    /* [*] To be called when ready for reading/writing; must call file_chg() afterwards */
42   int (*write_handler)(struct main_file *fi);
43   void (*error_handler)(struct main_file *fi, int cause);       /* [*] Handler to call on errors */
44   void *data;                                   /* [*] Data for use by the handlers */
45   byte *rbuf;                                   /* Read/write pointers for use by file_read/write */
46   uns rpos, rlen;
47   byte *wbuf;
48   uns wpos, wlen;
49   void (*read_done)(struct main_file *fi);      /* [*] Called when file_read is finished; rpos < rlen if EOF */
50   void (*write_done)(struct main_file *fi);     /* [*] Called when file_write is finished */
51   struct main_timer timer;
52   struct pollfd *pollfd;
53 };
54
55 enum main_file_err_cause {
56   MFERR_READ,
57   MFERR_WRITE,
58   MFERR_TIMEOUT
59 };
60
61 void file_add(struct main_file *fi);
62 void file_chg(struct main_file *fi);
63 void file_del(struct main_file *fi);
64 void file_read(struct main_file *fi, void *buf, uns len);
65 void file_write(struct main_file *fi, void *buf, uns len);
66 void file_set_timeout(struct main_file *fi, timestamp_t expires);
67 void file_close_all(void);                      /* Close all known main_file's; frequently used before fork() */
68
69 /* Hooks to be called in each iteration of the main loop */
70
71 struct main_hook {
72   cnode n;
73   int (*handler)(struct main_hook *ho);         /* [*] Hook function; returns HOOK_xxx */
74   void *data;                                   /* [*] For use by the handler */
75 };
76
77 enum main_hook_return {
78   HOOK_IDLE,                                    /* Call again when the main loop becomes idle again */
79   HOOK_RETRY,                                   /* Call again as soon as possible */
80   HOOK_DONE = -1,                               /* Shut down the main loop if all hooks return this value */
81   HOOK_SHUTDOWN = -2                            /* Shut down the main loop immediately */
82 };
83
84 void hook_add(struct main_hook *ho);
85 void hook_del(struct main_hook *ho);
86
87 /* Processes to watch */
88
89 struct main_process {
90   cnode n;
91   int pid;                                      /* Process id (0=not running) */
92   int status;                                   /* Exit status (-1=fork failed) */
93   char status_msg[EXIT_STATUS_MSG_SIZE];
94   void (*handler)(struct main_process *mp);     /* [*] Called when the process exits; process_del done automatically */
95   void *data;                                   /* [*] For use by the handler */
96 };
97
98 void process_add(struct main_process *mp);
99 void process_del(struct main_process *mp);
100 int process_fork(struct main_process *mp);
101
102 /* The main loop */
103
104 void main_init(void);
105 void main_loop(void);
106 void main_debug(void);
107
108 #endif