]> git.llucax.com Git - software/libev.git/blobdiff - ev.c
initial support for multiplicity
[software/libev.git] / ev.c
diff --git a/ev.c b/ev.c
index 1cafd9b04567cf7c5a4bda3974a2f4e8938ec160..8c05776921bb6093430192e94719fd38f6e857d5 100644 (file)
--- a/ev.c
+++ b/ev.c
@@ -115,44 +115,32 @@ typedef struct ev_watcher *W;
 typedef struct ev_watcher_list *WL;
 typedef struct ev_watcher_time *WT;
 
-static ev_tstamp now_floor, mn_now, diff; /* monotonic clock */
-static ev_tstamp rt_now;
-static int method;
-
-static int have_monotonic; /* runtime */
-
-static ev_tstamp method_fudge; /* stupid epoll-returns-early bug */
-static void (*method_modify)(EV_P_ int fd, int oev, int nev);
-static void (*method_poll)(EV_P_ ev_tstamp timeout);
-
-static int activecnt; /* number of active events */
-
-#if EV_USE_SELECT
-static unsigned char *vec_ri, *vec_ro, *vec_wi, *vec_wo;
-static int vec_max;
-#endif
-
-#if EV_USEV_POLL
-static struct pollfd *polls;
-static int pollmax, pollcnt;
-static int *pollidxs; /* maps fds into structure indices */
-static int pollidxmax;
-#endif
+/*****************************************************************************/
 
-#if EV_USE_EPOLL
-static int epoll_fd = -1;
+typedef struct
+{
+  struct ev_watcher_list *head;
+  unsigned char events;
+  unsigned char reify;
+} ANFD;
 
-static struct epoll_event *events;
-static int eventmax;
-#endif
+typedef struct
+{
+  W w;
+  int events;
+} ANPENDING;
 
-#if EV_USE_KQUEUE
-static int kqueue_fd;
-static struct kevent *kqueue_changes;
-static int kqueue_changemax, kqueue_changecnt;
-static struct kevent *kqueue_events;
-static int kqueue_eventmax;
+#ifdef EV_MULTIPLICITY
+struct ev_loop
+{
+# define VAR(name,decl) decl
+# include "ev_vars.h"
+};
+#else
+# define VAR(name,decl) static decl
+# include "ev_vars.h"
 #endif
+#undef VAR
 
 /*****************************************************************************/
 
@@ -210,16 +198,6 @@ ev_now (EV_P)
 
 /*****************************************************************************/
 
-typedef struct
-{
-  struct ev_watcher_list *head;
-  unsigned char events;
-  unsigned char reify;
-} ANFD;
-
-static ANFD *anfds;
-static int anfdmax;
-
 static void
 anfds_init (ANFD *base, int count)
 {
@@ -233,15 +211,6 @@ anfds_init (ANFD *base, int count)
     }
 }
 
-typedef struct
-{
-  W w;
-  int events;
-} ANPENDING;
-
-static ANPENDING *pendings [NUMPRI];
-static int pendingmax [NUMPRI], pendingcnt [NUMPRI];
-
 static void
 event (EV_P_ W w, int events)
 {
@@ -283,9 +252,6 @@ fd_event (EV_P_ int fd, int events)
 
 /*****************************************************************************/
 
-static int *fdchanges;
-static int fdchangemax, fdchangecnt;
-
 static void
 fd_reify (EV_P)
 {
@@ -368,12 +334,6 @@ fd_enomem (EV_P)
 
 /*****************************************************************************/
 
-static struct ev_timer **timers;
-static int timermax, timercnt;
-
-static struct ev_periodic **periodics;
-static int periodicmax, periodiccnt;
-
 static void
 upheap (WT *timers, int k)
 {
@@ -428,7 +388,6 @@ static int signalmax;
 
 static int sigpipe [2];
 static sig_atomic_t volatile gotsig;
-static struct ev_io sigev;
 
 static void
 signals_init (ANSIG *base, int count)
@@ -494,20 +453,6 @@ siginit (EV_P)
 
 /*****************************************************************************/
 
-static struct ev_idle **idles;
-static int idlemax, idlecnt;
-
-static struct ev_prepare **prepares;
-static int preparemax, preparecnt;
-
-static struct ev_check **checks;
-static int checkmax, checkcnt;
-
-/*****************************************************************************/
-
-static struct ev_child *childs [PID_HASHSIZE];
-static struct ev_signal childev;
-
 #ifndef WIN32
 
 #ifndef WCONTINUED
@@ -594,6 +539,10 @@ ev_method (EV_P)
 int
 ev_init (EV_P_ int methods)
 {
+#ifdef EV_MULTIPLICITY
+  memset (loop, 0, sizeof (struct ev_loop));
+#endif
+
   if (!method)
     {
 #if EV_USE_MONOTONIC