From: Jaroslav Kysela Date: Tue, 5 Dec 2017 14:39:37 +0000 (+0100) Subject: tvhpoll: big cleanups, add tvhpoll_add1 and tvhpoll_rem1 functions X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=688cbe5a3428a2faba0e39bbde7680a558e7aeee;p=thirdparty%2Ftvheadend.git tvhpoll: big cleanups, add tvhpoll_add1 and tvhpoll_rem1 functions --- diff --git a/src/dbus.c b/src/dbus.c index 7909ffb81..30223e3a8 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -366,22 +366,15 @@ dbus_server_thread(void *aux) } poll = tvhpoll_create(2); - memset(&ev, 0, sizeof(ev)); - ev.fd = dbus_pipe.rd; - ev.events = TVHPOLL_IN; - ev.data.ptr = &dbus_pipe; - tvhpoll_add(poll, &ev, 1); - memset(&ev, 0, sizeof(ev)); - if (!dbus_connection_get_unix_fd(conn, &ev.fd)) { + tvhpoll_add1(poll, dbus_pipe.rd, TVHPOLL_IN, &dbus_pipe); + if (!dbus_connection_get_unix_fd(conn, &n)) { atomic_set(&dbus_running, 0); tvhpoll_destroy(poll); dbus_connection_safe_close(notify); dbus_connection_safe_close(conn); return NULL; } - ev.events = TVHPOLL_IN; - ev.data.ptr = conn; - tvhpoll_add(poll, &ev, 1); + tvhpoll_add1(poll, n, TVHPOLL_IN, conn); while (atomic_get(&dbus_running)) { diff --git a/src/descrambler/capmt.c b/src/descrambler/capmt.c index a66ac0263..6ba631400 100644 --- a/src/descrambler/capmt.c +++ b/src/descrambler/capmt.c @@ -241,9 +241,11 @@ typedef struct capmt_opaque { typedef struct capmt_adapter { ca_info_t ca_info[MAX_INDEX]; + int ca_number; int ca_sock; mpegts_input_t *ca_tuner; capmt_opaque_t ca_pids[MAX_PIDS]; + sbuf_t ca_rbuf; } capmt_adapter_t; /** @@ -331,30 +333,20 @@ capmt_include_elementary_stream(streaming_component_type_t type) return SCT_ISAV(type) || type == SCT_DVBSUB || type == SCT_TELETEXT; } -static void -capmt_poll_add(capmt_t *capmt, int fd, uint32_t u32) +static int +capmt_poll_add(capmt_t *capmt, int fd, void *ptr) { - tvhpoll_event_t ev; - if (capmt->capmt_poll == NULL) - return; - memset(&ev, 0, sizeof(ev)); - ev.events = TVHPOLL_IN; - ev.fd = fd; - ev.data.u32 = u32; - tvhpoll_add(capmt->capmt_poll, &ev, 1); + return 0; + return tvhpoll_add1(capmt->capmt_poll, fd, TVHPOLL_IN, ptr); } -static void +static int capmt_poll_rem(capmt_t *capmt, int fd) { - tvhpoll_event_t ev; - if (capmt->capmt_poll == NULL) - return; - memset(&ev, 0, sizeof(ev)); - ev.fd = fd; - tvhpoll_rem(capmt->capmt_poll, &ev, 1); + return 0; + return tvhpoll_rem1(capmt->capmt_poll, fd); } static void @@ -542,7 +534,7 @@ capmt_connect(capmt_t *capmt, int i) capmt->capmt_sock_reconnect[i]++; if (capmt_oscam_netproto(capmt)) capmt_send_client_info(capmt); - capmt_poll_add(capmt, fd, i + 1); + capmt_poll_add(capmt, fd, &capmt->capmt_adapters[i]); } return fd; @@ -1493,29 +1485,29 @@ show_connection(capmt_t *capmt, const char *what) #if CONFIG_LINUXDVB static void -handle_ca0(capmt_t *capmt) { - int i, ret, recvsock, adapter, nfds, cmd_size; +handle_ca0(capmt_t *capmt) +{ + int i, ret, recvsock, nfds, cmd_size; uint32_t cmd; uint8_t buf[256]; - sbuf_t buffer[MAX_CA]; sbuf_t *pbuf; + capmt_adapter_t *adapter; tvhpoll_event_t ev[MAX_CA + 1]; show_connection(capmt, "ca0"); - for (i = 0; i < MAX_CA; i++) - sbuf_init(&buffer[i]); - capmt_notify_server(capmt, NULL, 1); capmt->capmt_poll = tvhpoll_create(MAX_CA + 1); - capmt_poll_add(capmt, capmt->capmt_pipe.rd, 0); - for (i = 0; i < MAX_CA; i++) - if (capmt->capmt_adapters[i].ca_sock) - capmt_poll_add(capmt, capmt->capmt_adapters[i].ca_sock, i + 1); + capmt_poll_add(capmt, capmt->capmt_pipe.rd, &capmt->capmt_pipe); + for (i = 0; i < MAX_CA; i++) { + adapter = &capmt->capmt_adapters[i]; + sbuf_init(&adapter->ca_rbuf); + if (adapter->ca_sock > 0) + capmt_poll_add(capmt, adapter->ca_sock, adapter); + } i = 0; - adapter = -1; while (atomic_get(&capmt->capmt_running)) { @@ -1526,7 +1518,7 @@ handle_ca0(capmt_t *capmt) { for (i = 0; i < nfds; i++) { - if (ev[i].data.u32 == 0) { + if (ev[i].data.ptr == &capmt->capmt_pipe) { ret = read(capmt->capmt_pipe.rd, buf, 1); if (ret == 1 && buf[0] == 'c') { capmt_flush_queue(capmt, 0); @@ -1538,12 +1530,11 @@ handle_ca0(capmt_t *capmt) { continue; } - adapter = ev[i].data.u32 - 1; - - if (adapter < 0 || adapter >= MAX_CA) + adapter = ev[i].data.ptr; + if (adapter == NULL) continue; - recvsock = capmt->capmt_adapters[adapter].ca_sock; + recvsock = adapter->ca_sock; if (recvsock <= 0) continue; @@ -1555,7 +1546,7 @@ handle_ca0(capmt_t *capmt) { close(recvsock); capmt_poll_rem(capmt, recvsock); - capmt->capmt_adapters[adapter].ca_sock = -1; + adapter->ca_sock = -1; continue; } @@ -1565,7 +1556,7 @@ handle_ca0(capmt_t *capmt) { tvhtrace(LS_CAPMT, "%s: Received message from socket %i", capmt_name(capmt), recvsock); tvhlog_hexdump(LS_CAPMT, buf, ret); - pbuf = &buffer[adapter]; + pbuf = &adapter->ca_rbuf; sbuf_append(pbuf, buf, ret); while (pbuf->sb_ptr > 0) { @@ -1577,7 +1568,7 @@ handle_ca0(capmt_t *capmt) { } if (cmd_size <= pbuf->sb_ptr) { cmd = sbuf_peek_u32(pbuf, 0); - capmt_analyze_cmd(capmt, cmd, adapter, pbuf, 4); + capmt_analyze_cmd(capmt, cmd, adapter->ca_number, pbuf, 4); sbuf_cut(pbuf, cmd_size); } else { break; @@ -1587,8 +1578,10 @@ handle_ca0(capmt_t *capmt) { } } - for (i = 0; i < MAX_CA; i++) - sbuf_free(&buffer[i]); + for (i = 0; i < MAX_CA; i++) { + adapter = &capmt->capmt_adapters[i]; + sbuf_free(&adapter->ca_rbuf); + } tvhpoll_destroy(capmt->capmt_poll); capmt->capmt_poll = NULL; } @@ -1612,8 +1605,8 @@ handle_single(capmt_t *capmt) capmt_notify_server(capmt, NULL, 1); capmt->capmt_poll = tvhpoll_create(2); - capmt_poll_add(capmt, capmt->capmt_pipe.rd, 0); - capmt_poll_add(capmt, capmt->capmt_sock[0], 1); + capmt_poll_add(capmt, capmt->capmt_pipe.rd, &capmt->capmt_pipe); + capmt_poll_add(capmt, capmt->capmt_sock[0], capmt->capmt_sock); while (atomic_get(&capmt->capmt_running)) { @@ -1622,7 +1615,7 @@ handle_single(capmt_t *capmt) if (nfds <= 0) continue; - if (ev.data.u32 == 0) { + if (ev.data.ptr == &capmt->capmt_pipe) { ret = read(capmt->capmt_pipe.rd, buf, 1); if (ret == 1 && buf[0] == 'c') { capmt_flush_queue(capmt, 0); @@ -1808,6 +1801,7 @@ capmt_thread(void *aux) fatal = 0; for (i = 0; i < MAX_CA; i++) { ca = &capmt->capmt_adapters[i]; + ca->ca_number = i; ca->ca_sock = -1; memset(&ca->ca_info, 0, sizeof(ca->ca_info)); for (j = 0; j < MAX_PIDS; j++) { diff --git a/src/httpc.c b/src/httpc.c index b776e0158..c66510409 100644 --- a/src/httpc.c +++ b/src/httpc.c @@ -158,10 +158,7 @@ http_client_shutdown ( http_client_t *hc, int force, int reconnect ) return; } if (hc->hc_efd) { - tvhpoll_event_t ev; - memset(&ev, 0, sizeof(ev)); - ev.fd = hc->hc_fd; - tvhpoll_rem(hc->hc_efd, &ev, 1); + tvhpoll_rem1(hc->hc_efd, hc->hc_fd); if (hc->hc_efd == http_poll && !reconnect) { pthread_mutex_lock(&http_lock); TAILQ_REMOVE(&http_clients, hc, hc_link); @@ -192,23 +189,15 @@ static void http_client_poll_dir ( http_client_t *hc, int in, int out ) { int events = (in ? TVHPOLL_IN : 0) | (out ? TVHPOLL_OUT : 0); - tvhpoll_event_t ev; if (hc->hc_efd) { if (events == 0 && hc->hc_pause) { tvhtrace(LS_HTTPC, "%04X: pausing input", shortid(hc)); if (hc->hc_pevents_pause == 0) hc->hc_pevents_pause = hc->hc_pevents; - memset(&ev, 0, sizeof(ev)); - ev.fd = hc->hc_fd; - ev.data.ptr = hc; - tvhpoll_rem(hc->hc_efd, &ev, 1); + tvhpoll_rem1(hc->hc_efd, hc->hc_fd); } else if (hc->hc_pevents != events) { tvhtrace(LS_HTTPC, "%04X: add poll for input%s (%x)", shortid(hc), out ? " and output" : "", events); - memset(&ev, 0, sizeof(ev)); - ev.fd = hc->hc_fd; - ev.events = events | TVHPOLL_IN; - ev.data.ptr = hc; - tvhpoll_add(hc->hc_efd, &ev, 1); + tvhpoll_add1(hc->hc_efd, hc->hc_fd, events | TVHPOLL_IN, hc); } } hc->hc_pevents = events; @@ -1614,7 +1603,6 @@ void http_client_close ( http_client_t *hc ) { http_client_wcmd_t *wcmd; - tvhpoll_event_t ev; if (hc == NULL) return; @@ -1625,9 +1613,7 @@ http_client_close ( http_client_t *hc ) while (hc->hc_running) tvh_cond_wait(&http_cond, &http_lock); if (hc->hc_efd) { - memset(&ev, 0, sizeof(ev)); - ev.fd = hc->hc_fd; - tvhpoll_rem(hc->hc_efd, &ev, 1); + tvhpoll_rem1(hc->hc_efd, hc->hc_fd); TAILQ_REMOVE(&http_clients, hc, hc_link); hc->hc_efd = NULL; } @@ -1674,8 +1660,6 @@ pthread_t http_client_tid; void http_client_init ( const char *user_agent ) { - tvhpoll_event_t ev; - http_user_agent = user_agent ? strdup(user_agent) : NULL; /* Setup list */ @@ -1688,11 +1672,7 @@ http_client_init ( const char *user_agent ) /* Setup poll */ http_poll = tvhpoll_create(10); - memset(&ev, 0, sizeof(ev)); - ev.fd = http_pipe.rd; - ev.events = TVHPOLL_IN; - ev.data.ptr = &http_pipe; - tvhpoll_add(http_poll, &ev, 1); + tvhpoll_add1(http_poll, http_pipe.rd, TVHPOLL_IN, &http_pipe); /* Setup thread */ atomic_set(&http_running, 1); diff --git a/src/input/mpegts/iptv/iptv.c b/src/input/mpegts/iptv/iptv.c index 944a264cc..bf8b4d62f 100644 --- a/src/input/mpegts/iptv/iptv.c +++ b/src/input/mpegts/iptv/iptv.c @@ -491,15 +491,10 @@ iptv_input_thread ( void *aux ) void iptv_input_pause_handler ( iptv_mux_t *im, int pause ) { - tvhpoll_event_t ev = { 0 }; - - ev.fd = im->mm_iptv_fd; - ev.events = TVHPOLL_IN; - ev.data.ptr = im; if (pause) - tvhpoll_rem(iptv_poll, &ev, 1); + tvhpoll_rem1(iptv_poll, im->mm_iptv_fd); else - tvhpoll_add(iptv_poll, &ev, 1); + tvhpoll_add1(iptv_poll, im->mm_iptv_fd, TVHPOLL_IN, im); } void @@ -584,16 +579,11 @@ int iptv_input_fd_started ( iptv_mux_t *im ) { char buf[256]; - tvhpoll_event_t ev = { 0 }; /* Setup poll */ if (im->mm_iptv_fd > 0) { - ev.fd = im->mm_iptv_fd; - ev.events = TVHPOLL_IN; - ev.data.ptr = im; - /* Error? */ - if (tvhpoll_add(iptv_poll, &ev, 1) == -1) { + if (tvhpoll_add1(iptv_poll, im->mm_iptv_fd, TVHPOLL_IN, im) < 0) { mpegts_mux_nice_name((mpegts_mux_t*)im, buf, sizeof(buf)); tvherror(LS_IPTV, "%s - failed to add to poll q", buf); close(im->mm_iptv_fd); @@ -604,12 +594,8 @@ iptv_input_fd_started ( iptv_mux_t *im ) /* Setup poll2 */ if (im->mm_iptv_fd2 > 0) { - ev.fd = im->mm_iptv_fd2; - ev.events = TVHPOLL_IN; - ev.data.ptr = im; - /* Error? */ - if (tvhpoll_add(iptv_poll, &ev, 1) == -1) { + if (tvhpoll_add1(iptv_poll, im->mm_iptv_fd2, TVHPOLL_IN, im) < 0) { mpegts_mux_nice_name((mpegts_mux_t*)im, buf, sizeof(buf)); tvherror(LS_IPTV, "%s - failed to add to poll q (2)", buf); close(im->mm_iptv_fd2); diff --git a/src/input/mpegts/linuxdvb/linuxdvb_ddci.c b/src/input/mpegts/linuxdvb/linuxdvb_ddci.c index fd930c361..4d5b890ea 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_ddci.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_ddci.c @@ -604,10 +604,7 @@ linuxdvb_ddci_read_thread ( void *arg ) /* Setup poll */ efd = tvhpoll_create(1); - memset(ev, 0, sizeof(ev)); - ev[0].events = TVHPOLL_IN; - ev[0].fd = ev[0].data.fd = fd; - tvhpoll_add(efd, ev, 1); + tvhpoll_add1(efd, fd, TVHPOLL_IN, NULL); /* Allocate memory */ sbuf_init_fixed(&sb, MINMAX(ddci_rd_thread->lddci_cfg_recv_buffer_sz, diff --git a/src/input/mpegts/satip/satip_frontend.c b/src/input/mpegts/satip/satip_frontend.c index a842670d2..f4bbb6215 100644 --- a/src/input/mpegts/satip/satip_frontend.c +++ b/src/input/mpegts/satip/satip_frontend.c @@ -1300,11 +1300,7 @@ satip_frontend_extra_shutdown rtsp->hc_rtsp_session = strdup((char *)session); - memset(&ev, 0, sizeof(ev)); - ev.events = TVHPOLL_IN; - ev.fd = rtsp->hc_fd; - ev.data.ptr = rtsp; - tvhpoll_add(efd, &ev, 1); + tvhpoll_add1(efd, rtsp->hc_fd, TVHPOLL_IN, rtsp); rtsp->hc_efd = efd; snprintf(b, sizeof(b), "/stream=%li", stream_id); @@ -1402,22 +1398,9 @@ satip_frontend_close_rtsp ( satip_frontend_t *lfe, const char *name, tvhpoll_t *efd, http_client_t *rtsp, satip_tune_req_t *tr ) { - tvhpoll_event_t ev; - - memset(&ev, 0, sizeof(ev)); - ev.events = TVHPOLL_IN; - ev.fd = lfe->sf_dvr_pipe.rd; - ev.data.ptr = NULL; - tvhpoll_rem(efd, &ev, 1); - + tvhpoll_rem1(efd, lfe->sf_dvr_pipe.rd); satip_frontend_shutdown(lfe, name, rtsp, tr, efd); - - memset(&ev, 0, sizeof(ev)); - ev.events = TVHPOLL_IN; - ev.fd = lfe->sf_dvr_pipe.rd; - ev.data.ptr = NULL; - tvhpoll_add(efd, &ev, 1); - + tvhpoll_add1(efd, lfe->sf_dvr_pipe.rd, TVHPOLL_IN, NULL); http_client_close(rtsp); } @@ -1598,11 +1581,7 @@ new_tune: if (rtsp) rtsp->hc_rtp_data_received = NULL; - memset(ev, 0, sizeof(ev)); - ev[0].events = TVHPOLL_IN; - ev[0].fd = lfe->sf_dvr_pipe.rd; - ev[0].data.ptr = NULL; - tvhpoll_add(efd, ev, 1); + tvhpoll_add1(efd, lfe->sf_dvr_pipe.rd, TVHPOLL_IN, NULL); lfe->mi_display_name((mpegts_input_t*)lfe, buf, sizeof(buf)); lfe->sf_display_name = buf; @@ -2064,21 +2043,13 @@ new_tune: udp_multirecv_free(&um); lfe->sf_curmux = NULL; + memset(ev, 0, sizeof(&ev)); nfds = 0; if ((rtsp_flags & SATIP_SETUP_TCP) == 0) { - ev[nfds].events = TVHPOLL_IN; - ev[nfds].fd = rtp->fd; - ev[nfds].data.ptr = rtp; - nfds++; - ev[nfds].events = TVHPOLL_IN; - ev[nfds].fd = rtcp->fd; - ev[nfds].data.ptr = rtcp; - nfds++; + ev[nfds++].fd = rtp->fd; + ev[nfds++].fd = rtcp->fd; } - ev[nfds].events = TVHPOLL_IN; - ev[nfds].fd = lfe->sf_dvr_pipe.rd; - ev[nfds].data.ptr = NULL; - nfds++; + ev[nfds++].fd = lfe->sf_dvr_pipe.rd; tvhpoll_rem(efd, ev, nfds); if (exit_flag) { diff --git a/src/input/mpegts/tsfile/tsfile_input.c b/src/input/mpegts/tsfile/tsfile_input.c index edb95d90f..d1b3f03d3 100644 --- a/src/input/mpegts/tsfile/tsfile_input.c +++ b/src/input/mpegts/tsfile/tsfile_input.c @@ -67,11 +67,8 @@ tsfile_input_thread ( void *aux ) if (fd == -1) return NULL; /* Polling */ - memset(&ev, 0, sizeof(ev)); efd = tvhpoll_create(2); - ev.events = TVHPOLL_IN; - ev.fd = ev.data.fd = mi->ti_thread_pipe.rd; - tvhpoll_add(efd, &ev, 1); + tvhpoll_add1(efd, mi->ti_thread_pipe.rd, TVHPOLL_IN, NULL); /* Alloc memory */ sbuf_init_fixed(&buf, 18800); diff --git a/src/tcp.c b/src/tcp.c index 5bd214940..1e4e16f23 100644 --- a/src/tcp.c +++ b/src/tcp.c @@ -199,11 +199,7 @@ again: tvhpoll_t *efd; efd = tvhpoll_create(1); - memset(&ev, 0, sizeof(ev)); - ev.events = TVHPOLL_OUT; - ev.fd = fd; - ev.data.ptr = &fd; - tvhpoll_add(efd, &ev, 1); + tvhpoll_add1(efd, fd, TVHPOLL_OUT, &fd); /* minimal timeout is one second */ if (timeout < 1) @@ -976,17 +972,11 @@ tcp_server_create void tcp_server_register(void *server) { tcp_server_t *ts = server; - tvhpoll_event_t ev; if (ts == NULL) return; - memset(&ev, 0, sizeof(ev)); - - ev.fd = ts->serverfd; - ev.events = TVHPOLL_IN; - ev.data.ptr = ts; - tvhpoll_add(tcp_server_poll, &ev, 1); + tvhpoll_add1(tcp_server_poll, ts->serverfd, TVHPOLL_IN, ts); } /** @@ -996,17 +986,12 @@ void tcp_server_delete(void *server) { tcp_server_t *ts = server; - tvhpoll_event_t ev; char c = 'D'; if (server == NULL) return; - memset(&ev, 0, sizeof(ev)); - ev.fd = ts->serverfd; - ev.events = TVHPOLL_IN; - ev.data.ptr = ts; - tvhpoll_rem(tcp_server_poll, &ev, 1); + tvhpoll_rem1(tcp_server_poll, ts->serverfd); close(ts->serverfd); ts->serverfd = -1; LIST_INSERT_HEAD(&tcp_server_delete_list, ts, link); @@ -1170,15 +1155,10 @@ tcp_server_preinit(int opt_ipv6) void tcp_server_init(void) { - tvhpoll_event_t ev; tvh_pipe(O_NONBLOCK, &tcp_server_pipe); tcp_server_poll = tvhpoll_create(10); - memset(&ev, 0, sizeof(ev)); - ev.fd = tcp_server_pipe.rd; - ev.events = TVHPOLL_IN; - ev.data.ptr = &tcp_server_pipe; - tvhpoll_add(tcp_server_poll, &ev, 1); + tvhpoll_add1(tcp_server_poll, tcp_server_pipe.rd, TVHPOLL_IN, &tcp_server_pipe); atomic_set(&tcp_server_running, 1); tvhthread_create(&tcp_server_tid, NULL, tcp_server_loop, NULL, "tcp-loop"); diff --git a/src/tvhpoll.c b/src/tvhpoll.c index 7d7116d67..4b8f119f3 100644 --- a/src/tvhpoll.c +++ b/src/tvhpoll.c @@ -153,6 +153,16 @@ int tvhpoll_add #endif } +int tvhpoll_add1 + ( tvhpoll_t *tp, int fd, int events, void *ptr ) +{ + tvhpoll_event_t ev = { 0 }; + ev.fd = fd; + ev.events = events; + ev.data.ptr = ptr; + return tvhpoll_add(tp, &ev, 1); +} + int tvhpoll_rem ( tvhpoll_t *tp, tvhpoll_event_t *evs, size_t num ) { @@ -172,6 +182,14 @@ int tvhpoll_rem return 0; } +int tvhpoll_rem1 + ( tvhpoll_t *tp, int fd ) +{ + tvhpoll_event_t ev = { 0 }; + ev.fd = fd; + return tvhpoll_rem(tp, &ev, 1); +} + int tvhpoll_wait ( tvhpoll_t *tp, tvhpoll_event_t *evs, size_t num, int ms ) { diff --git a/src/tvhpoll.h b/src/tvhpoll.h index 892bee5ba..9035f0c68 100644 --- a/src/tvhpoll.h +++ b/src/tvhpoll.h @@ -34,7 +34,7 @@ typedef struct tvhpoll_event uint64_t u64; uint32_t u32; int fd; - } data; + } data; } tvhpoll_event_t; #define TVHPOLL_IN 0x01 @@ -43,13 +43,12 @@ typedef struct tvhpoll_event #define TVHPOLL_ERR 0x08 #define TVHPOLL_HUP 0x10 -tvhpoll_t *tvhpoll_create ( size_t num ); -void tvhpoll_destroy ( tvhpoll_t *tp ); -int tvhpoll_add - ( tvhpoll_t *tp, tvhpoll_event_t *evs, size_t num ); -int tvhpoll_rem - ( tvhpoll_t *tp, tvhpoll_event_t *evs, size_t num ); -int tvhpoll_wait - ( tvhpoll_t *tp, tvhpoll_event_t *evs, size_t num, int ms ); +tvhpoll_t *tvhpoll_create(size_t num); +void tvhpoll_destroy(tvhpoll_t *tp); +int tvhpoll_add(tvhpoll_t *tp, tvhpoll_event_t *evs, size_t num); +int tvhpoll_add1(tvhpoll_t *tp, int fd, int events, void *ptr); +int tvhpoll_rem(tvhpoll_t *tp, tvhpoll_event_t *evs, size_t num); +int tvhpoll_rem1(tvhpoll_t *tp, int fd); +int tvhpoll_wait(tvhpoll_t *tp, tvhpoll_event_t *evs, size_t num, int ms); #endif /* __TVHPOLL_H__ */