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
|
#pragma once
#include <stddef.h> // IWYU pragma: keep
#include "nvim/event/defs.h" // IWYU pragma: keep
#include "nvim/os/time.h" // IWYU pragma: keep
#ifdef INCLUDE_GENERATED_DECLARATIONS
# include "event/multiqueue.h.generated.h"
#endif
#define multiqueue_put(q, h, ...) \
do { \
multiqueue_put_event(q, event_create(h, __VA_ARGS__)); \
} while (0)
#define CREATE_EVENT(multiqueue, handler, ...) \
do { \
if (multiqueue) { \
multiqueue_put((multiqueue), (handler), __VA_ARGS__); \
} else { \
void *argv[] = { __VA_ARGS__ }; \
(handler)(argv); \
} \
} while (0)
// Poll for events until a condition or timeout
#define LOOP_PROCESS_EVENTS_UNTIL(loop, multiqueue, timeout, condition) \
do { \
int64_t remaining = timeout; \
uint64_t before = (remaining > 0) ? os_hrtime() : 0; \
while (!(condition)) { \
LOOP_PROCESS_EVENTS(loop, multiqueue, remaining); \
if (remaining == 0) { \
break; \
} else if (remaining > 0) { \
uint64_t now = os_hrtime(); \
remaining -= (int64_t)((now - before) / 1000000); \
before = now; \
if (remaining <= 0) { \
break; \
} \
} \
} \
} while (0)
#define LOOP_PROCESS_EVENTS(loop, multiqueue, timeout) \
do { \
if (multiqueue && !multiqueue_empty(multiqueue)) { \
multiqueue_process_events(multiqueue); \
} else { \
loop_poll_events(loop, timeout); \
} \
} while (0)
|