From: Jaroslav Kysela Date: Sun, 12 Mar 2017 20:21:17 +0000 (+0100) Subject: linuxdvb: share file-descriptor across frontends in exclusive adapter mode, fixes... X-Git-Tag: v4.2.1~86 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=315b6e26b3258c97c029ad781819595c9a34d041;p=thirdparty%2Ftvheadend.git linuxdvb: share file-descriptor across frontends in exclusive adapter mode, fixes #4278 --- diff --git a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c index 65bb71117..410593703 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_frontend.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_frontend.c @@ -416,7 +416,7 @@ static void linuxdvb_frontend_enabled_updated ( mpegts_input_t *mi ) { char buf[512]; - linuxdvb_frontend_t *lfe = (linuxdvb_frontend_t*)mi; + linuxdvb_frontend_t *lfe = (linuxdvb_frontend_t*)mi, *lfe2; mi->mi_display_name(mi, buf, sizeof(buf)); @@ -433,7 +433,19 @@ linuxdvb_frontend_enabled_updated ( mpegts_input_t *mi ) /* Ensure FE opened (if not powersave) */ } else if (!lfe->lfe_powersave && lfe->lfe_fe_fd <= 0 && lfe->lfe_fe_path) { - lfe->lfe_fe_fd = tvh_open(lfe->lfe_fe_path, O_RDWR | O_NONBLOCK, 0); + + /* Share FD across frontends */ + if (lfe->lfe_adapter->la_exclusive) { + LIST_FOREACH(lfe2, &lfe->lfe_adapter->la_frontends, lfe_link) { + if (lfe2->lfe_fe_fd > 0) { + lfe->lfe_fe_fd = dup(lfe2->lfe_fe_fd); + break; + } + } + } + + if (lfe->lfe_fe_fd <= 0) + lfe->lfe_fe_fd = tvh_open(lfe->lfe_fe_path, O_RDWR | O_NONBLOCK, 0); tvhtrace(LS_LINUXDVB, "%s - opening FE %s (%d)", buf, lfe->lfe_fe_path, lfe->lfe_fe_fd); }