]> git.llucax.com Git - software/libev.git/blobdiff - ev.c
the dreaded fork
[software/libev.git] / ev.c
diff --git a/ev.c b/ev.c
index ab892213fe95e2745ec5035a5a073c4894ca54f9..f8b08f5e3e60e15dfe1209ab5dd28aaee1b571e0 100644 (file)
--- a/ev.c
+++ b/ev.c
@@ -987,6 +987,8 @@ loop_destroy (EV_P)
   backend = 0;
 }
 
   backend = 0;
 }
 
+void inline_size infy_fork (EV_P);
+
 void inline_size
 loop_fork (EV_P)
 {
 void inline_size
 loop_fork (EV_P)
 {
@@ -999,6 +1001,9 @@ loop_fork (EV_P)
 #if EV_USE_EPOLL
   if (backend == EVBACKEND_EPOLL ) epoll_fork  (EV_A);
 #endif
 #if EV_USE_EPOLL
   if (backend == EVBACKEND_EPOLL ) epoll_fork  (EV_A);
 #endif
+#if EV_USE_INOTIFY
+  infy_fork (EV_A);
+#endif
 
   if (ev_is_active (&sigev))
     {
 
   if (ev_is_active (&sigev))
     {
@@ -1833,6 +1838,38 @@ infy_init (EV_P)
     }
 }
 
     }
 }
 
+void inline_size
+infy_fork (EV_P)
+{
+  int slot;
+
+  if (fs_fd < 0)
+    return;
+
+  close (fs_fd);
+  fs_fd = inotify_init ();
+
+  for (slot = 0; slot < EV_INOTIFY_HASHSIZE; ++slot)
+    {
+      WL w_ = fs_hash [slot].head;
+      fs_hash [slot].head = 0;
+
+      while (w_)
+        {
+          ev_stat *w = (ev_stat *)w_;
+          w_ = w_->next; /* lets us add this watcher */
+
+          w->wd = -1;
+
+          if (fs_fd >= 0)
+            infy_add (EV_A_ w); /* re-add, no matter what */
+          else
+            ev_timer_start (EV_A_ &w->timer);
+        }
+
+    }
+}
+
 #endif
 
 void
 #endif
 
 void