-
Notifications
You must be signed in to change notification settings - Fork 20
/
Copy pathel.h
191 lines (165 loc) · 3.95 KB
/
el.h
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#ifndef EL_H
#define EL_H
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/time.h>
#include<time.h>
#include<arpa/inet.h>
#include<errno.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<signal.h>
#include "config.h"
#ifdef HAVE_KQUEUE_H
#include <sys/event.h>
#endif
#ifdef HAVE_EPOLL_H
#include <sys/epoll.h>
#endif
#define LISTENQ 1024
#define TRUE 1
#define FALSE 0
/*
---------------
all kinds of io multi flags
*/
#ifdef HAVE_KQUEUE_H
#define READ_EVENT EVFILT_READ
#define WRITE_EVENT EVFILT_WRITE
//max kqueue event's size
#define MAX_EVENT_COUNT 1024
#endif
#ifdef HAVE_EPOLL_H
#define READ_EVENT EPOLLIN
#define WRITE_EVENT EPOLLOUT
//epoll' fd size
#define EPOLL_FD_SIZE 1024
#endif
//---------------------
//max buffer's size
#define MAXLINE 1024
//callback
typedef void (*cb_func) (int fd, int size, void *arg);
typedef void (*io_init) (struct __el_loop *);
typedef void (*io_add) (struct __el_loop *, struct __event *);
typedef void (*io_del) (struct __el_loop *, struct __event *);
typedef void (*io_dispatch) (struct __el_loop *);
typedef void sigfunc(int);
typedef enum {
DEFAULT,
SIGNAL,
TIMER
} EVENT_TYPE;
/**
事件
**/
typedef struct __event {
int fd;
int flags;
int size;
void *arg;
cb_func cb;
EVENT_TYPE type;
struct __event *next;
struct __event *prev;
} event;
typedef struct __sig_event {
int pipe[2];
int signo;
struct __sig_event *next;
struct __sig_event *prev;
event *sevent;
} sig_event;
/**
信号事件队列
**/
typedef struct __sig_event_list {
int count;
sig_event *head;
} sig_event_list;
/**
事件队列
**/
typedef struct __el_event_list {
int count;
event *head;
} el_event_list;
typedef struct __io_multi {
const char *name;
io_init init;
io_add add;
io_del del;
io_dispatch dispatch;
} io_multi;
typedef struct __el_loop {
int event_count;
io_multi io;
int ioid;
int timeout; //ms
el_event_list *active_events;
el_event_list *ready_events;
} el_loop;
//error.c
void error(const char *msg);
//user.c
el_loop *el_loop_new();
event *el_event_new(int fd, int flags, cb_func cb, void *arg);
void el_event_add(el_loop *loop, event *e);
int el_loop_run(el_loop *loop);
void el_loop_free(el_loop *loop);
event *el_sigevent_new(int signo, cb_func cb, void *arg);
void el_error(const char *msg);
event *el_timer(int timeout, cb_func cb, void *arg);
//event.c
event *event_init(int fd, int flags, cb_func cb, void *arg);
void event_free(event *ev);
//event_list.c
el_event_list *event_list_init();
void event_list_put(el_event_list *list, event *item);
event *event_list_get(el_event_list *list);
event *event_list_delete(el_event_list *list, int fd);
int event_list_size(el_event_list *list);
int event_list_is_empty(el_event_list *list);
void event_list_free(el_event_list *list);
//loop.c
el_loop *loop_create();
void loop_free(el_loop *loop);
int loop_run(el_loop *loop);
//kqueue.c
#ifdef HAVE_KQUEUE_H
void kqueue_init(el_loop *loop);
void kqueue_add(el_loop *loop, event *ev);
void kqueue_del(el_loop *loop, event *ev);
void kqueue_dispatch(el_loop *loop);
void using_kqueue(el_loop* loop);
#endif
//epoll.c
#ifdef HAVE_EPOLL_H
void epoll_init(el_loop *loop);
void epoll_add(el_loop *loop, event *ev);
void epoll_del(el_loop *loop, event *ev);
void epoll_dispatch(el_loop *loop);
void using_epoll(el_loop *loop);
#endif
//utils.c
void set_nonblock(int fd);
void init_pipe(sig_event *se);
void register_handler(int signo);
void init_signal(sig_event * se) ;
//signal_event.c
sig_event *sig_event_init(event *e, int signo);
void sig_event_free(sig_event *sig);
void sig_event_list_init(sig_event_list *list);
void sig_event_list_add(sig_event_list *list, sig_event *e);
sig_event *find_sigevent(sig_event_list *list, int no);
//timer.c
int time_from_start_to_now(struct timespec start);
void reset_time(struct timespec *ts);
//全局信号链表
extern sig_event_list sig_list;
//超时事件
extern event *tevent;
#endif