}
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)) {
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;
/**
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
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;
#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)) {
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);
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;
close(recvsock);
capmt_poll_rem(capmt, recvsock);
- capmt->capmt_adapters[adapter].ca_sock = -1;
+ adapter->ca_sock = -1;
continue;
}
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) {
}
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;
}
}
- 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;
}
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)) {
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);
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++) {
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);
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;
http_client_close ( http_client_t *hc )
{
http_client_wcmd_t *wcmd;
- tvhpoll_event_t ev;
if (hc == NULL)
return;
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;
}
void
http_client_init ( const char *user_agent )
{
- tvhpoll_event_t ev;
-
http_user_agent = user_agent ? strdup(user_agent) : NULL;
/* Setup list */
/* 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);
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
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);
/* 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);
/* 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,
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);
( 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);
}
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;
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) {
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);
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)
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);
}
/**
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);
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");
#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 )
{
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 )
{
uint64_t u64;
uint32_t u32;
int fd;
- } data;
+ } data;
} tvhpoll_event_t;
#define TVHPOLL_IN 0x01
#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__ */