]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
tvhpoll: corrected some mistakes and expanded usage for user data.
authorAdam Sutton <dev@adamsutton.me.uk>
Fri, 31 May 2013 13:10:28 +0000 (14:10 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Fri, 31 May 2013 13:22:29 +0000 (14:22 +0100)
src/tvhpoll.c
src/tvhpoll.h

index cd98522283448984e6714519323a2738b6c3aba9..f40cfa8a8824916537da772132f10a260998e6ce 100644 (file)
@@ -106,13 +106,16 @@ int tvhpoll_add
   struct epoll_event ev;
   for (i = 0; i < num; i++) {
     memset(&ev, 0, sizeof(ev));
-    ev.data.fd = evs[i].fd;
+    ev.data.u64 = evs[i].data.u64;
     if (evs[i].events & TVHPOLL_IN)  ev.events |= EPOLLIN;
     if (evs[i].events & TVHPOLL_OUT) ev.events |= EPOLLOUT;
     if (evs[i].events & TVHPOLL_PRI) ev.events |= EPOLLPRI;
     if (evs[i].events & TVHPOLL_ERR) ev.events |= EPOLLERR;
-    epoll_ctl(tp->fd, EPOLL_CTL_ADD, evs[i].fd, &ev);
+    if (evs[i].events & TVHPOLL_HUP) ev.events |= EPOLLHUP;
+    if (epoll_ctl(tp->fd, EPOLL_CTL_ADD, evs[i].fd, &ev) != 0)
+      return -1;
   }
+  return 0;
 #elif ENABLE_KQUEUE
   int i;
   uint32_t fflags;
@@ -121,12 +124,11 @@ int tvhpoll_add
     fflags = 0;
     if (evs[i].events & TVHPOLL_OUT) fflags |= EVFILT_WRITE;
     if (evs[i].events & TVHPOLL_IN)  fflags |= EVFILT_READ;
-    EV_SET(tp->ev+i, evs[i].fd, fflags, EV_ADD, 0, 0, NULL);
+    EV_SET(tp->ev+i, evs[i].fd, fflags, EV_ADD, 0, 0, evs[i].data.u64);
   }
-  kevent(tp->fd, tp->ev, num, NULL, 0, NULL);
+  return kevent(tp->fd, tp->ev, num, NULL, 0, NULL);
 #else
 #endif
-  return 0;
 }
 
 int tvhpoll_rem
@@ -155,12 +157,13 @@ int tvhpoll_wait
 #if ENABLE_EPOLL
   nfds = epoll_wait(tp->fd, tp->ev, num, ms);
   for (i = 0; i < nfds; i++) {
-    evs[i].fd     = tp->ev[i].data.fd;
-    evs[i].events = 0;
+    evs[i].data.u64 = tp->ev[i].data.u64;
+    evs[i].events   = 0;
     if (tp->ev[i].events & EPOLLIN)  evs[i].events |= TVHPOLL_IN;
     if (tp->ev[i].events & EPOLLOUT) evs[i].events |= TVHPOLL_OUT;
     if (tp->ev[i].events & EPOLLERR) evs[i].events |= TVHPOLL_ERR;
     if (tp->ev[i].events & EPOLLPRI) evs[i].events |= TVHPOLL_PRI;
+    if (tp->ev[i].events & EPOLLHUP) evs[i].events |= TVHPOLL_HUP;
   }
 #elif ENABLE_KQUEUE
   struct timespec tm, *to = NULL;
@@ -171,10 +174,12 @@ int tvhpoll_wait
   }
   nfds = kevent(tp->fd, NULL, 0, tp->ev, num, to);
   for (i = 0; i < nfds; i++) {
-    evs[i].fd     = tp->ev[i].ident;
-    evs[i].events = 0;
+    evs[i].fd       = tp->ev[i].ident;
+    evs[i].events   = 0;
+    evs[i].data.u64 = tp->ev[i].udata;
     if (tp->ev[i].fflags & EVFILT_WRITE) evs[i].events |= TVHPOLL_OUT;
     if (tp->ev[i].fflags & EVFILT_READ)  evs[i].events |= TVHPOLL_IN;
+    if (tp->ev[i].flags  & EV_EOF)       evs[i].events |= TVHPOLL_HUP;
   }
 #else
 #endif
index afdbfbc93e71442f95cf326ffd62ce294bb2d533..981b5c49176341ec017e0282b14525ff12b2ea88 100644 (file)
  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef __TVH_POLL_H__
-#define __TVH_POLL_H_
+#ifndef __TVHPOLL_H__
+#define __TVHPOLL_H__
 
 #include <sys/types.h>
 
 typedef struct tvhpoll tvhpoll_t;
 typedef struct tvhpoll_event
 {
-  int fd;
-  int events;
+  int  fd; // input
+  int  events;
+  union {
+    void     *ptr;
+    uint64_t u64;
+    uint32_t u32;
+    int      fd;
+  }    data;
 } tvhpoll_event_t;
 
 #define TVHPOLL_IN  0x01
 #define TVHPOLL_OUT 0x02
 #define TVHPOLL_PRI 0x04
 #define TVHPOLL_ERR 0x08
+#define TVHPOLL_HUP 0x10
 
 tvhpoll_t *tvhpoll_create  ( size_t num );
 void       tvhpoll_destroy ( tvhpoll_t *tp );
@@ -44,4 +51,4 @@ int        tvhpoll_rem
 int        tvhpoll_wait
   ( tvhpoll_t *tp, tvhpoll_event_t *evs, size_t num, int ms );
 
-#endif /* __TVH_POLL_H__ */
+#endif /* __TVHPOLL_H__ */