shrink the hashmap when it's too sparse
[beanstalkd.git] / linux.c
blob863344171d3ae3446a00d3e3571db29dd9f3da2e
1 #define _XOPEN_SOURCE 600
2 #include <stdint.h>
3 #include <fcntl.h>
4 #include <stdlib.h>
5 #include <errno.h>
6 #include <sys/epoll.h>
7 #include "dat.h"
9 #ifndef EPOLLRDHUP
10 #define EPOLLRDHUP 0x2000
11 #endif
13 static int epfd;
16 /* Allocate disk space.
17 * Expects fd's offset to be 0; may also reset fd's offset to 0.
18 * Returns 0 on success, and a positive errno otherwise. */
19 int
20 rawfalloc(int fd, int len)
22 return posix_fallocate(fd, 0, len);
26 int
27 sockinit(void)
29 epfd = epoll_create(1);
30 if (epfd == -1) {
31 twarn("epoll_create");
32 return -1;
34 return 0;
38 int
39 sockwant(Socket *s, int rw)
41 int op;
42 struct epoll_event ev = {};
44 if (!s->added && !rw) {
45 return 0;
46 } else if (!s->added && rw) {
47 s->added = 1;
48 op = EPOLL_CTL_ADD;
49 } else if (!rw) {
50 op = EPOLL_CTL_DEL;
51 } else {
52 op = EPOLL_CTL_MOD;
55 switch (rw) {
56 case 'r':
57 ev.events = EPOLLIN;
58 break;
59 case 'w':
60 ev.events = EPOLLOUT;
61 break;
63 ev.events |= EPOLLRDHUP | EPOLLPRI;
64 ev.data.ptr = s;
66 return epoll_ctl(epfd, op, s->fd, &ev);
70 int
71 socknext(Socket **s, int64 timeout)
73 int r;
74 struct epoll_event ev;
76 r = epoll_wait(epfd, &ev, 1, (int)(timeout/1000000));
77 if (r == -1 && errno != EINTR) {
78 twarn("epoll_wait");
79 exit(1);
82 if (r > 0) {
83 *s = ev.data.ptr;
84 if (ev.events & (EPOLLHUP|EPOLLRDHUP)) {
85 return 'h';
86 } else if (ev.events & EPOLLIN) {
87 return 'r';
88 } else if (ev.events & EPOLLOUT) {
89 return 'w';
92 return 0;