return;
ts_flush(t, sb);
+ service_send_streaming_status((service_t *)t);
}
/*
{
if(len >= 188)
sbuf_err(&st->es_buf, len / 188);
- if(st->es_buf.sb_err > 1000)
+ if(st->es_buf.sb_err > 1000) {
parser_deliver_error(t, st);
+ service_send_streaming_status((service_t *)t);
+ }
}
/**
}
+/**
+ *
+ */
+void
+service_send_streaming_status(service_t *t)
+{
+ lock_assert(&t->s_stream_mutex);
+
+ streaming_pad_deliver(&t->s_streaming_pad,
+ streaming_msg_create_code(SMT_SERVICE_STATUS,
+ t->s_streaming_status));
+
+ pthread_cond_broadcast(&t->s_tss_cond);
+}
+
/**
*
*/
set & TSS_GRACEPERIOD ? "[Graceperiod expired] " : "",
set & TSS_TIMEOUT ? "[Data timeout] " : "");
- streaming_pad_deliver(&t->s_streaming_pad,
- streaming_msg_create_code(SMT_SERVICE_STATUS,
- t->s_streaming_status));
-
- pthread_cond_broadcast(&t->s_tss_cond);
+ service_send_streaming_status(t);
}
-
/**
* Restart output on a service.
* Happens if the stream composition changes.
void service_remove_subscriber(service_t *t, struct th_subscription *s,
int reason);
+
+void service_send_streaming_status(service_t *t);
+
void service_set_streaming_status_flags_(service_t *t, int flag);
static inline void
service_set_streaming_status_flags_(t, n & ~flag);
}
+
struct streaming_start;
struct streaming_start *service_build_stream_start(service_t *t);
}
+/**
+ *
+ */
+int
+tcp_socket_dead(int fd)
+{
+ int err = 0;
+ socklen_t errlen = sizeof(err);
+
+ if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &errlen))
+ return -errno;
+ if (err)
+ return -err;
+ if (recv(fd, NULL, 0, MSG_PEEK | MSG_DONTWAIT) == 0)
+ return -EIO;
+ return 0;
+}
+
/**
*
*/
struct sockaddr *tcp_get_ip_from_str(const char *str, struct sockaddr *sa);
+int tcp_socket_dead(int fd);
+
struct access;
uint32_t tcp_connection_count(struct access *aa);
int ptimeout, grace = 20;
struct timespec ts;
struct timeval tp;
- int err = 0;
- socklen_t errlen = sizeof(err);
streaming_start_t *ss_copy;
int64_t mono;
if(pthread_cond_timedwait(&sq->sq_cond, &sq->sq_mutex, &ts) == ETIMEDOUT) {
/* Check socket status */
- if (getsockopt(hc->hc_fd, SOL_SOCKET, SO_ERROR, (char *)&err, &errlen) || err) {
+ if (tcp_socket_dead(hc->hc_fd)) {
tvhlog(LOG_DEBUG, "webui", "Stop streaming %s, client hung up", hc->hc_url_orig);
run = 0;
} else if((!started && dispatch_clock - lastpkt > grace) ||
case SMT_PACKET:
lastpkt = dispatch_clock;
if(started) {
- pktbuf_t *pb;;
+ pktbuf_t *pb;
if (sm->sm_type == SMT_PACKET)
pb = ((th_pkt_t*)sm->sm_data)->pkt_payload;
else
streaming_msg_free(sm);
mono = getmonoclock() + 2000000;
while (getmonoclock() < mono) {
- if (getsockopt(hc->hc_fd, SOL_SOCKET, SO_ERROR, (char *)&err, &errlen) || err)
+ if (tcp_socket_dead(hc->hc_fd))
break;
usleep(50000);
}
break;
case SMT_SERVICE_STATUS:
- if(getsockopt(hc->hc_fd, SOL_SOCKET, SO_ERROR, &err, &errlen) || err) {
+ if(tcp_socket_dead(hc->hc_fd)) {
tvhlog(LOG_DEBUG, "webui", "Stop streaming %s, client hung up",
hc->hc_url_orig);
run = 0;