libubox
C utility functions for OpenWrt.
uloop.h
Go to the documentation of this file.
1 /*
2  * uloop - event loop implementation
3  *
4  * Copyright (C) 2010-2013 Felix Fietkau <nbd@openwrt.org>
5  *
6  * Permission to use, copy, modify, and/or distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 #ifndef _ULOOP_H__
19 #define _ULOOP_H__
20 
21 #include <sys/time.h>
22 #include <sys/types.h>
23 #include <stdbool.h>
24 #include <stdint.h>
25 #include <signal.h>
26 
27 #if defined(__APPLE__) || defined(__FreeBSD__)
28 #define USE_KQUEUE
29 #else
30 #define USE_EPOLL
31 #endif
32 
33 #include "list.h"
34 
35 struct uloop_fd;
36 struct uloop_timeout;
37 struct uloop_process;
38 struct uloop_interval;
39 struct uloop_signal;
40 
41 typedef void (*uloop_fd_handler)(struct uloop_fd *u, unsigned int events);
42 typedef void (*uloop_timeout_handler)(struct uloop_timeout *t);
43 typedef void (*uloop_process_handler)(struct uloop_process *c, int ret);
44 typedef void (*uloop_interval_handler)(struct uloop_interval *t);
45 typedef void (*uloop_signal_handler)(struct uloop_signal *s);
46 
47 #define ULOOP_READ (1 << 0)
48 #define ULOOP_WRITE (1 << 1)
49 #define ULOOP_EDGE_TRIGGER (1 << 2)
50 #define ULOOP_BLOCKING (1 << 3)
51 
52 #define ULOOP_EVENT_MASK (ULOOP_READ | ULOOP_WRITE)
53 
54 /* internal flags */
55 #define ULOOP_EVENT_BUFFERED (1 << 4)
56 #ifdef USE_KQUEUE
57 #define ULOOP_EDGE_DEFER (1 << 5)
58 #endif
59 
60 #define ULOOP_ERROR_CB (1 << 6)
61 
62 struct uloop_fd
63 {
65  int fd;
66  bool eof;
67  bool error;
68  bool registered;
69  uint8_t flags;
70 };
71 
73 {
74  struct list_head list;
75  bool pending;
76 
78  struct timeval time;
79 };
80 
82 {
83  struct list_head list;
84  bool pending;
85 
87  pid_t pid;
88 };
89 
91 {
93  uint64_t expirations;
94 
95  union {
96  struct uloop_fd ufd;
97  struct {
98  int64_t fired;
99  unsigned int msecs;
100  } time;
101  } priv;
102 };
103 
105 {
106  struct list_head list;
107  struct sigaction orig;
108  bool pending;
109 
111  int signo;
112 };
113 
114 extern bool uloop_cancelled;
115 extern bool uloop_handle_sigchld;
117 
118 int uloop_fd_add(struct uloop_fd *sock, unsigned int flags);
119 int uloop_fd_delete(struct uloop_fd *sock);
120 
121 int uloop_get_next_timeout(void);
122 int uloop_timeout_add(struct uloop_timeout *timeout);
123 int uloop_timeout_set(struct uloop_timeout *timeout, int msecs);
124 int uloop_timeout_cancel(struct uloop_timeout *timeout);
125 int uloop_timeout_remaining(struct uloop_timeout *timeout) __attribute__((deprecated("use uloop_timeout_remaining64")));
126 int64_t uloop_timeout_remaining64(struct uloop_timeout *timeout);
127 
128 int uloop_process_add(struct uloop_process *p);
129 int uloop_process_delete(struct uloop_process *p);
130 
131 int uloop_interval_set(struct uloop_interval *timer, unsigned int msecs);
132 int uloop_interval_cancel(struct uloop_interval *timer);
133 int64_t uloop_interval_remaining(struct uloop_interval *timer);
134 
135 int uloop_signal_add(struct uloop_signal *s);
136 int uloop_signal_delete(struct uloop_signal *s);
137 
138 bool uloop_cancelling(void);
139 
140 static inline void uloop_end(void)
141 {
142  uloop_cancelled = true;
143 }
144 
145 int uloop_init(void);
146 int uloop_run_timeout(int timeout);
147 static inline int uloop_run(void)
148 {
149  return uloop_run_timeout(-1);
150 }
151 void uloop_done(void);
152 
153 #endif
struct blob_attr_info __attribute__
Definition: ulog.c:107
Definition: list.h:53
Definition: uloop.h:63
bool eof
Definition: uloop.h:66
bool registered
Definition: uloop.h:68
uint8_t flags
Definition: uloop.h:69
int fd
Definition: uloop.h:65
uloop_fd_handler cb
Definition: uloop.h:64
bool error
Definition: uloop.h:67
uint64_t expirations
Definition: uloop.h:93
union uloop_interval::@15 priv
unsigned int msecs
Definition: uloop.h:99
uloop_interval_handler cb
Definition: uloop.h:92
struct uloop_fd ufd
Definition: uloop.h:96
struct uloop_interval::@15::@16 time
int64_t fired
Definition: uloop.h:98
pid_t pid
Definition: uloop.h:87
uloop_process_handler cb
Definition: uloop.h:86
struct list_head list
Definition: uloop.h:83
bool pending
Definition: uloop.h:84
bool pending
Definition: uloop.h:108
uloop_signal_handler cb
Definition: uloop.h:110
struct list_head list
Definition: uloop.h:106
struct sigaction orig
Definition: uloop.h:107
int signo
Definition: uloop.h:111
bool pending
Definition: uloop.h:75
struct list_head list
Definition: uloop.h:74
uloop_timeout_handler cb
Definition: uloop.h:77
struct timeval time
Definition: uloop.h:78
static struct epoll_event events[ULOOP_MAX_EVENTS]
Definition: uloop-epoll.c:60
int64_t uloop_timeout_remaining64(struct uloop_timeout *timeout)
Definition: uloop.c:379
int uloop_run_timeout(int timeout)
Definition: uloop.c:658
void(* uloop_timeout_handler)(struct uloop_timeout *t)
Definition: uloop.h:42
int uloop_get_next_timeout(void)
Definition: uloop.c:595
int uloop_signal_add(struct uloop_signal *s)
Definition: uloop.c:550
void(* uloop_process_handler)(struct uloop_process *c, int ret)
Definition: uloop.h:43
int uloop_interval_set(struct uloop_interval *timer, unsigned int msecs)
Definition: uloop.c:453
int uloop_process_delete(struct uloop_process *p)
Definition: uloop.c:412
int uloop_fd_add(struct uloop_fd *sock, unsigned int flags)
Definition: uloop.c:235
static void uloop_end(void)
Definition: uloop.h:140
void(* uloop_interval_handler)(struct uloop_interval *t)
Definition: uloop.h:44
int uloop_timeout_cancel(struct uloop_timeout *timeout)
Definition: uloop.c:348
int uloop_fd_delete(struct uloop_fd *sock)
Definition: uloop.c:265
bool uloop_handle_sigchld
Definition: uloop.c:64
uloop_fd_handler uloop_fd_set_cb
Definition: uloop.c:72
int uloop_signal_delete(struct uloop_signal *s)
Definition: uloop.c:581
int64_t uloop_interval_remaining(struct uloop_interval *timer)
Definition: uloop.c:463
static int uloop_run(void)
Definition: uloop.h:147
void uloop_done(void)
Definition: uloop.c:686
int uloop_timeout_remaining(struct uloop_timeout *timeout) __attribute__((deprecated("use uloop_timeout_remaining64")))
Definition: uloop.c:359
void(* uloop_fd_handler)(struct uloop_fd *u, unsigned int events)
Definition: uloop.h:41
int uloop_interval_cancel(struct uloop_interval *timer)
Definition: uloop.c:458
bool uloop_cancelled
Definition: uloop.c:63
bool uloop_cancelling(void)
Definition: uloop.c:653
int uloop_timeout_add(struct uloop_timeout *timeout)
Definition: uloop.c:298
int uloop_init(void)
Definition: uloop.c:150
int uloop_timeout_set(struct uloop_timeout *timeout, int msecs)
Definition: uloop.c:328
int uloop_process_add(struct uloop_process *p)
Definition: uloop.c:391
void(* uloop_signal_handler)(struct uloop_signal *s)
Definition: uloop.h:45