svn commit: r472317 - in head/multimedia/tvheadend: . files

Bernhard Froehlich decke at FreeBSD.org
Wed Jun 13 13:13:38 UTC 2018


Author: decke
Date: Wed Jun 13 13:13:36 2018
New Revision: 472317
URL: https://svnweb.freebsd.org/changeset/ports/472317

Log:
  multimedia/tvheadend: fix two major problems of webui on FreeBSD
  
  1. very high CPU usage while streaming a recored program
  2. unable to stream the recorded program beyond 128MB.
  
  Unlike Linux sendfile(), FreeBSD sendfile() requires an explicit
  file offset, and return value must be checked to catch any error
  occurred. (i.e., closed connection)
  
  Obtained from:	https://github.com/tvheadend/tvheadend/pull/1125
  Submitted by:	Jongsung Kim <jongsung.kim at gmail.com>

Added:
  head/multimedia/tvheadend/files/patch-src_webui_webui.c   (contents, props changed)
Modified:
  head/multimedia/tvheadend/Makefile

Modified: head/multimedia/tvheadend/Makefile
==============================================================================
--- head/multimedia/tvheadend/Makefile	Wed Jun 13 13:12:44 2018	(r472316)
+++ head/multimedia/tvheadend/Makefile	Wed Jun 13 13:13:36 2018	(r472317)
@@ -4,7 +4,7 @@
 PORTNAME=	tvheadend
 PORTVERSION=	4.2.6
 DISTVERSIONPREFIX=	v
-PORTREVISION=	2
+PORTREVISION=	3
 CATEGORIES=	multimedia
 
 PATCH_SITES=	https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/commit/

Added: head/multimedia/tvheadend/files/patch-src_webui_webui.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/multimedia/tvheadend/files/patch-src_webui_webui.c	Wed Jun 13 13:13:36 2018	(r472317)
@@ -0,0 +1,74 @@
+From d19ee83aba20e5a64a6cef6dd528191a71f9aa31 Mon Sep 17 00:00:00 2001
+From: Jongsung Kim <jongsung.kim at gmail.com>
+Date: Tue, 29 May 2018 03:42:04 +0900
+Subject: [PATCH] webui: fix http_serve_file() for FreeBSD
+
+This patch fixes two major problems of FreeBSD port of tvheadend:
+
+1. very high CPU usage while streaming a recored program
+2. unable to stream the recorded program beyond 128MB.
+
+Unlike Linux sendfile(), FreeBSD sendfile() requires an explicit
+file offset, and return value must be checked to catch any error
+occurred. (i.e., closed connection)
+
+Patch tested with the latest FreeBSD port of tvheadend-4.2.6.
+
+--- src/webui/webui.c.orig	2018-03-26 10:19:37.000000000 +0200
++++ src/webui/webui.c	2018-06-13 14:47:58.627430000 +0200
+@@ -1570,7 +1570,7 @@
+ #if defined(PLATFORM_LINUX)
+   ssize_t r;
+ #elif defined(PLATFORM_FREEBSD) || defined(PLATFORM_DARWIN)
+-  off_t r;
++  off_t o, r;
+ #endif
+   
+   if (fconv) {
+@@ -1631,6 +1631,7 @@
+   sprintf(range_buf, "bytes %jd-%jd/%jd",
+     file_start, file_end, (intmax_t)st.st_size);
+ 
++#if defined(PLATFORM_LINUX)
+   if(file_start > 0)
+     if (lseek(fd, file_start, SEEK_SET) != file_start) {
+       close(fd);
+@@ -1644,6 +1645,9 @@
+       return ret;
+     }
+   }
++#elif defined(PLATFORM_FREEBSD) || defined(PLATFORM_DARWIN)
++  o = file_start;
++#endif
+ 
+   http_send_begin(hc);
+   http_send_header(hc, range ? HTTP_STATUS_PARTIAL_CONTENT : HTTP_STATUS_OK,
+@@ -1656,16 +1660,22 @@
+       chunk = MIN(1024 * ((stats ? 128 : 1024) * 1024), content_len);
+ #if defined(PLATFORM_LINUX)
+       r = sendfile(hc->hc_fd, fd, NULL, chunk);
++      if (r < 0) {
++        ret = -1;
++        break;
++      }
+ #elif defined(PLATFORM_FREEBSD)
+-      sendfile(fd, hc->hc_fd, 0, chunk, NULL, &r, 0);
++      ret = sendfile(fd, hc->hc_fd, o, chunk, NULL, &r, 0);
++      if (ret < 0)
++        break;
++      o += r;
+ #elif defined(PLATFORM_DARWIN)
+       r = chunk;
+-      sendfile(fd, hc->hc_fd, 0, &r, NULL, 0);
+-#endif
+-      if(r < 0) {
+-        ret = -1;
++      ret = sendfile(fd, hc->hc_fd, o, &r, NULL, 0);
++      if (ret < 0)
+         break;
+-      }
++      o += r;
++#endif
+       content_len -= r;
+       if (stats)
+         stats(hc, r, opaque);


More information about the svn-ports-all mailing list