ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libev/ev_epoll.c
Revision: 1.1
Committed: Tue Oct 30 20:59:31 2007 UTC (16 years, 6 months ago) by root
Content type: text/plain
Branch: MAIN
Log Message:
initial roguh cut that doesn't immediately barf

File Contents

# User Rev Content
1 root 1.1 #include <sys/epoll.h>
2    
3     static int epoll_fd = -1;
4    
5     static void
6     epoll_reify_fd (int fd)
7     {
8     ANFD *anfd = anfds + fd;
9     struct ev_io *w;
10    
11     int wev = 0;
12    
13     for (w = anfd->head; w; w = w->next)
14     wev |= w->events;
15    
16     if (anfd->wev != wev)
17     {
18     int mode = wev ? anfd->wev ? EPOLL_CTL_MOD : EPOLL_CTL_ADD : EPOLL_CTL_DEL;
19     struct epoll_event ev;
20     ev.events = wev;
21     ev.data.fd = fd;
22     fprintf (stderr, "reify %d,%d,%d m%d (r=%d)\n", fd, anfd->wev, wev, mode,//D
23     epoll_ctl (epoll_fd, mode, fd, &ev)
24     );//D
25     anfd->wev = wev;
26     }
27     }
28    
29     void epoll_postfork_child (void)
30     {
31     int i;
32    
33     epoll_fd = epoll_create (256);
34    
35     for (i = 0; i < anfdmax; ++i)
36     epoll_reify_fd (i);
37     }
38    
39     static void epoll_reify (void)
40     {
41     int i;
42     for (i = 0; i < fdchangecnt; ++i)
43     epoll_reify_fd (fdchanges [i]);
44     }
45    
46     static struct epoll_event *events;
47     static int eventmax;
48    
49     static void epoll_poll (ev_tstamp timeout)
50     {
51     int eventcnt = epoll_wait (epoll_fd, events, eventmax, ceil (timeout * 1000.));
52     int i;
53    
54     if (eventcnt < 0)
55     return;
56    
57     for (i = 0; i < eventcnt; ++i)
58     fd_event (
59     events [i].data.fd,
60     (events [i].events & (EPOLLOUT | EPOLLERR | EPOLLHUP | EPOLLPRI) ? EV_WRITE : 0)
61     | (events [i].events & (EPOLLIN | EPOLLERR | EPOLLHUP) ? EV_READ : 0)
62     );
63    
64     /* if the receive array was full, increase its size */
65     if (eventcnt == eventmax)
66     {
67     free (events);
68     eventmax += eventmax >> 1;
69     events = malloc (sizeof (struct epoll_event) * eventmax);
70     }
71     }
72    
73     int epoll_init (int flags)
74     {
75     epoll_fd = epoll_create (256);
76    
77     if (epoll_fd < 0)
78     return 0;
79    
80     ev_method = EVMETHOD_EPOLL;
81     method_fudge = 1e-3; /* needed to compensate fro epoll returning early */
82     method_reify = epoll_reify;
83     method_poll = epoll_poll;
84    
85     eventmax = 64; /* intiial number of events receivable per poll */
86     events = malloc (sizeof (struct epoll_event) * eventmax);
87    
88     return 1;
89     }