]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
tvhpoll: added support (epoll) for auto-modifying poll entries
authorAdam Sutton <dev@adamsutton.me.uk>
Sat, 23 Nov 2013 21:36:20 +0000 (21:36 +0000)
committerAdam Sutton <dev@adamsutton.me.uk>
Sun, 24 Nov 2013 20:34:38 +0000 (20:34 +0000)
src/tvhpoll.c
src/tvhpoll.h

index a543f22f5a6a6291b7ecc13468bf7678cc927616..29e5893601f55f6258a8b431a692bb5d011c5daf 100644 (file)
@@ -101,8 +101,8 @@ void tvhpoll_destroy ( tvhpoll_t *tp )
 int tvhpoll_add
   ( tvhpoll_t *tp, tvhpoll_event_t *evs, size_t num )
 {
+  int i, rc;
 #if ENABLE_EPOLL
-  int i;
   struct epoll_event ev;
   for (i = 0; i < num; i++) {
     memset(&ev, 0, sizeof(ev));
@@ -112,13 +112,14 @@ int tvhpoll_add
     if (evs[i].events & TVHPOLL_PRI) ev.events |= EPOLLPRI;
     if (evs[i].events & TVHPOLL_ERR) ev.events |= EPOLLERR;
     if (evs[i].events & TVHPOLL_HUP) ev.events |= EPOLLHUP;
-    if (epoll_ctl(tp->fd, EPOLL_CTL_ADD, evs[i].fd, &ev) != 0)
-      return -1;
+    rc = epoll_ctl(tp->fd, EPOLL_CTL_ADD, evs[i].fd, &ev);
+    if (rc && errno == EEXIST) {
+      if (epoll_ctl(tp->fd, EPOLL_CTL_MOD, evs[i].fd, &ev))
+        return -1;
+    }
   }
   return 0;
 #elif ENABLE_KQUEUE
-  int i;
-  int rc;
   tvhpoll_alloc(tp, num);
   for (i = 0; i < num; i++) {
     if (evs[i].events & TVHPOLL_OUT){
@@ -149,7 +150,6 @@ int tvhpoll_add
 int tvhpoll_rem
   ( tvhpoll_t *tp, tvhpoll_event_t *evs, size_t num )
 {
-  tvhpoll_alloc(tp, num);
 #if ENABLE_EPOLL
   int i;
   for (i = 0; i < num; i++)
index 981b5c49176341ec017e0282b14525ff12b2ea88..892bee5bab773f84c2dd5cb0c942e70730e79c8c 100644 (file)
@@ -21,6 +21,7 @@
 #ifndef __TVHPOLL_H__
 #define __TVHPOLL_H__
 
+#include <stdint.h>
 #include <sys/types.h>
 
 typedef struct tvhpoll tvhpoll_t;