-
Notifications
You must be signed in to change notification settings - Fork 0
/
dsk-main.c
137 lines (116 loc) · 4.19 KB
/
dsk-main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include "dsk.h"
void dsk_main_watch_fd (DskFileDescriptor fd,
unsigned events,
DskFDFunc callback,
void *callback_data)
{
dsk_assert (fd >= 0);
dsk_dispatch_watch_fd (dsk_dispatch_default (),
fd, events, callback, callback_data);
}
void dsk_main_close_fd (DskFileDescriptor fd)
{
dsk_dispatch_close_fd (dsk_dispatch_default (), fd);
}
void dsk_main_fd_closed (DskFileDescriptor fd)
{
dsk_dispatch_fd_closed (dsk_dispatch_default (), fd);
}
DskDispatchTimer *dsk_main_add_timer (unsigned timeout_secs,
unsigned timeout_usecs,
DskTimerFunc func,
void *func_data)
{
return dsk_dispatch_add_timer (dsk_dispatch_default (),
timeout_secs, timeout_usecs, func, func_data);
}
DskDispatchTimer *dsk_main_add_timer_millis(unsigned milliseconds,
DskTimerFunc func,
void *func_data)
{
return dsk_dispatch_add_timer_millis (dsk_dispatch_default (),
milliseconds, func, func_data);
}
void
dsk_main_adjust_timer (DskDispatchTimer *timer,
unsigned timeout_secs,
unsigned timeout_usecs)
{
dsk_dispatch_adjust_timer (timer, timeout_secs, timeout_usecs);
}
void dsk_main_adjust_timer_millis (DskDispatchTimer *timer,
unsigned milliseconds)
{
dsk_dispatch_adjust_timer_millis (timer, milliseconds);
}
void dsk_main_remove_timer (DskDispatchTimer *timer)
{
dsk_dispatch_remove_timer (timer);
}
DskDispatchIdle *dsk_main_add_idle (DskIdleFunc func,
void *func_data)
{
return dsk_dispatch_add_idle (dsk_dispatch_default (), func, func_data);
}
void dsk_main_remove_idle (DskDispatchIdle *idle)
{
dsk_dispatch_remove_idle (idle);
}
DskDispatchSignal*dsk_main_add_signal (int signal_number,
DskSignalHandler func,
void *func_data)
{
return dsk_dispatch_add_signal (dsk_dispatch_default (),
signal_number, func, func_data);
}
void dsk_main_remove_signal (DskDispatchSignal *signal)
{
dsk_dispatch_remove_signal (signal);
}
DskDispatchChild *dsk_main_add_child (int process_id,
DskChildHandler func,
void *func_data)
{
return dsk_dispatch_add_child (dsk_dispatch_default (),
process_id, func, func_data);
}
void dsk_main_remove_child (DskDispatchChild *child)
{
dsk_dispatch_remove_child (child);
}
/* program termination (terminate when ref-count gets to 0);
* many programs leave 0 refs the whole time.
*/
static unsigned main_n_refs = 0;
static int main_exit_status = -1;
void dsk_main_add_object (void *object)
{
dsk_main_add_ref ();
dsk_object_trap_finalize (object, (DskDestroyNotify) dsk_main_remove_ref, NULL);
}
void dsk_main_add_ref (void)
{
++main_n_refs;
}
void dsk_main_remove_ref (void)
{
dsk_assert (main_n_refs > 0);
if (--main_n_refs == 0)
dsk_main_quit ();
}
int
dsk_main_run (void)
{
DskDispatch *d = dsk_dispatch_default ();
while (main_exit_status < 0)
dsk_dispatch_run (d);
return main_exit_status;
}
void dsk_main_exit (int exit_status)
{
main_exit_status = exit_status;
}
void dsk_main_quit (void)
{
main_exit_status = 0;
}