• source navigation  • diff markup  • identifier search  • freetext search  • 

Sources/libubox/uloop.h

  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 {
 64         uloop_fd_handler cb;
 65         int fd;
 66         bool eof;
 67         bool error;
 68         bool registered;
 69         uint8_t flags;
 70 };
 71 
 72 struct uloop_timeout
 73 {
 74         struct list_head list;
 75         bool pending;
 76 
 77         uloop_timeout_handler cb;
 78         struct timeval time;
 79 };
 80 
 81 struct uloop_process
 82 {
 83         struct list_head list;
 84         bool pending;
 85 
 86         uloop_process_handler cb;
 87         pid_t pid;
 88 };
 89 
 90 struct uloop_interval
 91 {
 92         uloop_interval_handler cb;
 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 
104 struct uloop_signal
105 {
106         struct list_head list;
107         struct sigaction orig;
108         bool pending;
109 
110         uloop_signal_handler cb;
111         int signo;
112 };
113 
114 extern bool uloop_cancelled;
115 extern bool uloop_handle_sigchld;
116 extern uloop_fd_handler uloop_fd_set_cb;
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
154 

This page was automatically generated by LXR 0.3.1.  •  OpenWrt