about summary refs log tree commit homepage
path: root/ext/sleepy_penguin/epoll.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/sleepy_penguin/epoll.c')
-rw-r--r--ext/sleepy_penguin/epoll.c17
1 files changed, 2 insertions, 15 deletions
diff --git a/ext/sleepy_penguin/epoll.c b/ext/sleepy_penguin/epoll.c
index 5e5cb20..423ed69 100644
--- a/ext/sleepy_penguin/epoll.c
+++ b/ext/sleepy_penguin/epoll.c
@@ -1,7 +1,6 @@
 #include "sleepy_penguin.h"
 #ifdef HAVE_SYS_EPOLL_H
 #include <sys/epoll.h>
-#include <unistd.h>
 #include <time.h>
 #include "missing_clock_gettime.h"
 #include "missing_epoll.h"
@@ -52,10 +51,8 @@ static int ep_fd_check(struct ep_per_thread *ept)
 
 static struct ep_per_thread *ept_get(VALUE self, int maxevents)
 {
-        static __thread struct ep_per_thread *ept;
+        struct ep_per_thread *ept;
         size_t size;
-        int err;
-        void *ptr;
 
         /* error check here to prevent OOM from posix_memalign */
         if (maxevents <= 0) {
@@ -63,21 +60,11 @@ static struct ep_per_thread *ept_get(VALUE self, int maxevents)
                 rb_sys_fail("epoll_wait maxevents <= 0");
         }
 
-        if (ept && ept->capa >= maxevents)
-                goto out;
-
         size = sizeof(struct ep_per_thread) +
                sizeof(struct epoll_event) * maxevents;
 
-        free(ept); /* free(NULL) is POSIX and works on glibc */
-        err = posix_memalign(&ptr, rb_sp_l1_cache_line_size, size);
-        if (err) {
-                errno = err;
-                rb_memerror();
-        }
-        ept = ptr;
+        ept = rb_sp_gettlsbuf(&size);
         ept->capa = maxevents;
-out:
         ept->maxevents = maxevents;
         ept->io = self;
         ept->fd = rb_sp_fileno(ept->io);