Blame


1 8fbe3fd5 2024-02-17 op /*
2 8fbe3fd5 2024-02-17 op * This is free and unencumbered software released into the public domain.
3 8fbe3fd5 2024-02-17 op *
4 8fbe3fd5 2024-02-17 op * Anyone is free to copy, modify, publish, use, compile, sell, or
5 8fbe3fd5 2024-02-17 op * distribute this software, either in source code form or as a compiled
6 8fbe3fd5 2024-02-17 op * binary, for any purpose, commercial or non-commercial, and by any
7 8fbe3fd5 2024-02-17 op * means.
8 8fbe3fd5 2024-02-17 op *
9 8fbe3fd5 2024-02-17 op * In jurisdictions that recognize copyright laws, the author or authors
10 8fbe3fd5 2024-02-17 op * of this software dedicate any and all copyright interest in the
11 8fbe3fd5 2024-02-17 op * software to the public domain. We make this dedication for the benefit
12 8fbe3fd5 2024-02-17 op * of the public at large and to the detriment of our heirs and
13 8fbe3fd5 2024-02-17 op * successors. We intend this dedication to be an overt act of
14 8fbe3fd5 2024-02-17 op * relinquishment in perpetuity of all present and future rights to this
15 8fbe3fd5 2024-02-17 op * software under copyright law.
16 8fbe3fd5 2024-02-17 op *
17 8fbe3fd5 2024-02-17 op * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 8fbe3fd5 2024-02-17 op * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 8fbe3fd5 2024-02-17 op * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 8fbe3fd5 2024-02-17 op * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21 8fbe3fd5 2024-02-17 op * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22 8fbe3fd5 2024-02-17 op * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 8fbe3fd5 2024-02-17 op * OTHER DEALINGS IN THE SOFTWARE.
24 8fbe3fd5 2024-02-17 op */
25 8fbe3fd5 2024-02-17 op
26 8fbe3fd5 2024-02-17 op #include "compat.h"
27 8fbe3fd5 2024-02-17 op
28 56ba7392 2024-02-22 op #include <sys/time.h>
29 56ba7392 2024-02-22 op
30 8fbe3fd5 2024-02-17 op #include <assert.h>
31 8fbe3fd5 2024-02-17 op #include <stdio.h>
32 8fbe3fd5 2024-02-17 op #include <stdlib.h>
33 8fbe3fd5 2024-02-17 op #include <unistd.h>
34 8fbe3fd5 2024-02-17 op
35 8fbe3fd5 2024-02-17 op #include <poll.h>
36 8fbe3fd5 2024-02-17 op
37 8fbe3fd5 2024-02-17 op #include "ev.h"
38 8fbe3fd5 2024-02-17 op
39 8fbe3fd5 2024-02-17 op int fired_a;
40 8fbe3fd5 2024-02-17 op int fired_b;
41 8fbe3fd5 2024-02-17 op int fired_c;
42 8fbe3fd5 2024-02-17 op
43 8fbe3fd5 2024-02-17 op struct timeval tv_a = { 0, 250000 };
44 8fbe3fd5 2024-02-17 op struct timeval tv_b = { 0, 300000 };
45 8fbe3fd5 2024-02-17 op struct timeval tv_c = { 0, 350000 };
46 8fbe3fd5 2024-02-17 op
47 8fbe3fd5 2024-02-17 op unsigned long tout_a;
48 8fbe3fd5 2024-02-17 op unsigned long tout_b;
49 8fbe3fd5 2024-02-17 op unsigned long tout_c;
50 8fbe3fd5 2024-02-17 op
51 8fbe3fd5 2024-02-17 op static void
52 8fbe3fd5 2024-02-17 op pipe_ev(int fd, int ev, void *data)
53 8fbe3fd5 2024-02-17 op {
54 8fbe3fd5 2024-02-17 op warn("shouldn't have happened!");
55 8fbe3fd5 2024-02-17 op abort();
56 8fbe3fd5 2024-02-17 op }
57 8fbe3fd5 2024-02-17 op
58 8fbe3fd5 2024-02-17 op static void
59 8fbe3fd5 2024-02-17 op timeout_cb(int fd, int ev, void *data)
60 8fbe3fd5 2024-02-17 op {
61 8fbe3fd5 2024-02-17 op int *d = data;
62 8fbe3fd5 2024-02-17 op
63 8fbe3fd5 2024-02-17 op assert(fd == -1);
64 8fbe3fd5 2024-02-17 op *d = 1;
65 8fbe3fd5 2024-02-17 op }
66 8fbe3fd5 2024-02-17 op
67 8fbe3fd5 2024-02-17 op static void
68 8fbe3fd5 2024-02-17 op timeout_cancel_b(int fd, int ev, void *data)
69 8fbe3fd5 2024-02-17 op {
70 8fbe3fd5 2024-02-17 op timeout_cb(fd, ev, data);
71 8fbe3fd5 2024-02-17 op ev_timer_cancel(tout_b);
72 8fbe3fd5 2024-02-17 op }
73 8fbe3fd5 2024-02-17 op
74 8fbe3fd5 2024-02-17 op static void
75 8fbe3fd5 2024-02-17 op timeout_quit(int fd, int ev, void *data)
76 8fbe3fd5 2024-02-17 op {
77 8fbe3fd5 2024-02-17 op timeout_cb(fd, ev, data);
78 8fbe3fd5 2024-02-17 op ev_break();
79 8fbe3fd5 2024-02-17 op }
80 8fbe3fd5 2024-02-17 op
81 8fbe3fd5 2024-02-17 op int
82 8fbe3fd5 2024-02-17 op main(void)
83 8fbe3fd5 2024-02-17 op {
84 8fbe3fd5 2024-02-17 op int p[2];
85 8fbe3fd5 2024-02-17 op
86 8fbe3fd5 2024-02-17 op alarm(2); /* safety net */
87 8fbe3fd5 2024-02-17 op
88 8fbe3fd5 2024-02-17 op /* the ev subsystem needs at least a file descriptor */
89 8fbe3fd5 2024-02-17 op if (pipe(p) == -1)
90 8fbe3fd5 2024-02-17 op err(1, "pipe");
91 8fbe3fd5 2024-02-17 op
92 8fbe3fd5 2024-02-17 op if (ev_init() == -1)
93 8fbe3fd5 2024-02-17 op err(1, "ev_init");
94 8fbe3fd5 2024-02-17 op
95 8fbe3fd5 2024-02-17 op if (ev_add(p[0], POLLIN, pipe_ev, NULL) == -1)
96 8fbe3fd5 2024-02-17 op err(1, "ev_add");
97 8fbe3fd5 2024-02-17 op
98 3a691a42 2024-02-18 op if ((tout_c = ev_timer(&tv_c, timeout_quit, &fired_c)) == 0 ||
99 8fbe3fd5 2024-02-17 op (tout_b = ev_timer(&tv_b, timeout_cb, &fired_b)) == 0 ||
100 3a691a42 2024-02-18 op (tout_a = ev_timer(&tv_a, timeout_cancel_b, &fired_a)) == 0)
101 8fbe3fd5 2024-02-17 op err(1, "ev_timer");
102 8fbe3fd5 2024-02-17 op
103 8fbe3fd5 2024-02-17 op ev_loop();
104 8fbe3fd5 2024-02-17 op
105 8fbe3fd5 2024-02-17 op if (fired_a && !fired_b && fired_c)
106 8fbe3fd5 2024-02-17 op return 0;
107 8fbe3fd5 2024-02-17 op
108 8fbe3fd5 2024-02-17 op errx(1, "events fired not as expected: a:%d b:%d c:%d",
109 8fbe3fd5 2024-02-17 op fired_a, fired_b, fired_c);
110 8fbe3fd5 2024-02-17 op }