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 8fbe3fd5 2024-02-17 op #include <assert.h>
29 8fbe3fd5 2024-02-17 op #include <stdio.h>
30 8fbe3fd5 2024-02-17 op #include <stdlib.h>
31 8fbe3fd5 2024-02-17 op #include <unistd.h>
32 8fbe3fd5 2024-02-17 op
33 8fbe3fd5 2024-02-17 op #include <poll.h>
34 8fbe3fd5 2024-02-17 op
35 8fbe3fd5 2024-02-17 op #include "ev.h"
36 8fbe3fd5 2024-02-17 op
37 8fbe3fd5 2024-02-17 op int fired_a;
38 8fbe3fd5 2024-02-17 op int fired_b;
39 8fbe3fd5 2024-02-17 op int fired_c;
40 8fbe3fd5 2024-02-17 op
41 8fbe3fd5 2024-02-17 op struct timeval tv_a = { 0, 250000 };
42 8fbe3fd5 2024-02-17 op struct timeval tv_b = { 0, 300000 };
43 8fbe3fd5 2024-02-17 op struct timeval tv_c = { 0, 350000 };
44 8fbe3fd5 2024-02-17 op
45 8fbe3fd5 2024-02-17 op unsigned long tout_a;
46 8fbe3fd5 2024-02-17 op unsigned long tout_b;
47 8fbe3fd5 2024-02-17 op unsigned long tout_c;
48 8fbe3fd5 2024-02-17 op
49 8fbe3fd5 2024-02-17 op static void
50 8fbe3fd5 2024-02-17 op pipe_ev(int fd, int ev, void *data)
51 8fbe3fd5 2024-02-17 op {
52 8fbe3fd5 2024-02-17 op warn("shouldn't have happened!");
53 8fbe3fd5 2024-02-17 op abort();
54 8fbe3fd5 2024-02-17 op }
55 8fbe3fd5 2024-02-17 op
56 8fbe3fd5 2024-02-17 op static void
57 8fbe3fd5 2024-02-17 op timeout_cb(int fd, int ev, void *data)
58 8fbe3fd5 2024-02-17 op {
59 8fbe3fd5 2024-02-17 op int *d = data;
60 8fbe3fd5 2024-02-17 op
61 8fbe3fd5 2024-02-17 op assert(fd == -1);
62 8fbe3fd5 2024-02-17 op *d = 1;
63 8fbe3fd5 2024-02-17 op }
64 8fbe3fd5 2024-02-17 op
65 8fbe3fd5 2024-02-17 op static void
66 8fbe3fd5 2024-02-17 op timeout_cancel_b(int fd, int ev, void *data)
67 8fbe3fd5 2024-02-17 op {
68 8fbe3fd5 2024-02-17 op timeout_cb(fd, ev, data);
69 8fbe3fd5 2024-02-17 op ev_timer_cancel(tout_b);
70 8fbe3fd5 2024-02-17 op }
71 8fbe3fd5 2024-02-17 op
72 8fbe3fd5 2024-02-17 op static void
73 8fbe3fd5 2024-02-17 op timeout_quit(int fd, int ev, void *data)
74 8fbe3fd5 2024-02-17 op {
75 8fbe3fd5 2024-02-17 op timeout_cb(fd, ev, data);
76 8fbe3fd5 2024-02-17 op ev_break();
77 8fbe3fd5 2024-02-17 op }
78 8fbe3fd5 2024-02-17 op
79 8fbe3fd5 2024-02-17 op int
80 8fbe3fd5 2024-02-17 op main(void)
81 8fbe3fd5 2024-02-17 op {
82 8fbe3fd5 2024-02-17 op int p[2];
83 8fbe3fd5 2024-02-17 op
84 8fbe3fd5 2024-02-17 op alarm(2); /* safety net */
85 8fbe3fd5 2024-02-17 op
86 8fbe3fd5 2024-02-17 op /* the ev subsystem needs at least a file descriptor */
87 8fbe3fd5 2024-02-17 op if (pipe(p) == -1)
88 8fbe3fd5 2024-02-17 op err(1, "pipe");
89 8fbe3fd5 2024-02-17 op
90 8fbe3fd5 2024-02-17 op if (ev_init() == -1)
91 8fbe3fd5 2024-02-17 op err(1, "ev_init");
92 8fbe3fd5 2024-02-17 op
93 8fbe3fd5 2024-02-17 op if (ev_add(p[0], POLLIN, pipe_ev, NULL) == -1)
94 8fbe3fd5 2024-02-17 op err(1, "ev_add");
95 8fbe3fd5 2024-02-17 op
96 3a691a42 2024-02-18 op if ((tout_c = ev_timer(&tv_c, timeout_quit, &fired_c)) == 0 ||
97 8fbe3fd5 2024-02-17 op (tout_b = ev_timer(&tv_b, timeout_cb, &fired_b)) == 0 ||
98 3a691a42 2024-02-18 op (tout_a = ev_timer(&tv_a, timeout_cancel_b, &fired_a)) == 0)
99 8fbe3fd5 2024-02-17 op err(1, "ev_timer");
100 8fbe3fd5 2024-02-17 op
101 8fbe3fd5 2024-02-17 op ev_loop();
102 8fbe3fd5 2024-02-17 op
103 8fbe3fd5 2024-02-17 op if (fired_a && !fired_b && fired_c)
104 8fbe3fd5 2024-02-17 op return 0;
105 8fbe3fd5 2024-02-17 op
106 8fbe3fd5 2024-02-17 op errx(1, "events fired not as expected: a:%d b:%d c:%d",
107 8fbe3fd5 2024-02-17 op fired_a, fired_b, fired_c);
108 8fbe3fd5 2024-02-17 op }