From 9ed26c1a54a173104e2b2c714b75dc7c21036183 Mon Sep 17 00:00:00 2001 From: Adam Sutton Date: Thu, 13 Sep 2012 16:40:20 +0100 Subject: [PATCH] Make closing file descriptors (when idle) optional, it breaks some (i.e. my) cards. --- src/dvb/dvb.h | 3 +++ src/dvb/dvb_adapter.c | 30 ++++++++++++++++++++++++++++-- src/webui/extjs_dvb.c | 4 ++++ src/webui/static/app/dvb.js | 6 +++++- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/dvb/dvb.h b/src/dvb/dvb.h index 783274e9..528df4e6 100644 --- a/src/dvb/dvb.h +++ b/src/dvb/dvb.h @@ -177,6 +177,7 @@ typedef struct th_dvb_adapter { char *tda_identifier; uint32_t tda_autodiscovery; uint32_t tda_idlescan; + uint32_t tda_idleclose; uint32_t tda_skip_initialscan; uint32_t tda_skip_checksubscr; uint32_t tda_qmon; @@ -303,6 +304,8 @@ void dvb_adapter_set_qmon(th_dvb_adapter_t *tda, int on); void dvb_adapter_set_dump_muxes(th_dvb_adapter_t *tda, int on); +void dvb_adapter_set_idleclose(th_dvb_adapter_t *tda, int on); + void dvb_adapter_set_poweroff(th_dvb_adapter_t *tda, int on); void dvb_adapter_set_sidtochan(th_dvb_adapter_t *tda, int on); diff --git a/src/dvb/dvb_adapter.c b/src/dvb/dvb_adapter.c index f4450a58..ad25b85d 100644 --- a/src/dvb/dvb_adapter.c +++ b/src/dvb/dvb_adapter.c @@ -86,6 +86,7 @@ tda_save(th_dvb_adapter_t *tda) htsmsg_add_str(m, "displayname", tda->tda_displayname); htsmsg_add_u32(m, "autodiscovery", tda->tda_autodiscovery); htsmsg_add_u32(m, "idlescan", tda->tda_idlescan); + htsmsg_add_u32(m, "idleclose", tda->tda_idleclose); htsmsg_add_u32(m, "skip_checksubscr", tda->tda_skip_checksubscr); htsmsg_add_u32(m, "qmon", tda->tda_qmon); htsmsg_add_u32(m, "dump_muxes", tda->tda_dump_muxes); @@ -179,6 +180,25 @@ dvb_adapter_set_idlescan(th_dvb_adapter_t *tda, int on) tda_save(tda); } +/** + * + */ +void +dvb_adapter_set_idleclose(th_dvb_adapter_t *tda, int on) +{ + if(tda->tda_idleclose == on) + return; + + lock_assert(&global_lock); + + tvhlog(LOG_NOTICE, "dvb", "Adapter \"%s\" idle fd close set to: %s", + tda->tda_displayname, on ? "On" : "Off"); + + tda->tda_idleclose = on; + tda_save(tda); +} + + /** * */ @@ -394,7 +414,6 @@ tda_add(int adapter_num) tda->tda_dvr_path = malloc(256); snprintf(tda->tda_dvr_path, 256, "%s/dvr0", path); tda->tda_fe_path = strdup(fname); - tda->tda_fe_fd = -1; tda->tda_dvr_pipe[0] = -1; @@ -406,7 +425,10 @@ tda_add(int adapter_num) free(tda); return; } - close(fe); + if (tda->tda_idlescan || !tda->tda_idleclose) + tda->tda_fe_fd = fe; + else + close(fe); tda->tda_type = tda->tda_fe_info->type; @@ -474,6 +496,9 @@ dvb_adapter_stop ( th_dvb_adapter_t *tda ) /* Poweroff */ dvb_adapter_poweroff(tda); + /* Don't stop/close */ + if (!tda->tda_idleclose) return; + /* Close front end */ if (tda->tda_fe_fd != -1) { tvhlog(LOG_DEBUG, "dvb", "%s closing frontend", tda->tda_rootpath); @@ -540,6 +565,7 @@ dvb_adapter_init(uint32_t adapter_mask) htsmsg_get_u32(c, "autodiscovery", &tda->tda_autodiscovery); htsmsg_get_u32(c, "idlescan", &tda->tda_idlescan); + htsmsg_get_u32(c, "idleclose", &tda->tda_idleclose); htsmsg_get_u32(c, "skip_checksubscr", &tda->tda_skip_checksubscr); htsmsg_get_u32(c, "qmon", &tda->tda_qmon); htsmsg_get_u32(c, "dump_muxes", &tda->tda_dump_muxes); diff --git a/src/webui/extjs_dvb.c b/src/webui/extjs_dvb.c index 45bcb8d9..94adc399 100644 --- a/src/webui/extjs_dvb.c +++ b/src/webui/extjs_dvb.c @@ -150,6 +150,7 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque) htsmsg_add_u32(r, "automux", tda->tda_autodiscovery); htsmsg_add_u32(r, "skip_initialscan", tda->tda_skip_initialscan); htsmsg_add_u32(r, "idlescan", tda->tda_idlescan); + htsmsg_add_u32(r, "idleclose", tda->tda_idleclose); htsmsg_add_u32(r, "skip_checksubscr", tda->tda_skip_checksubscr); htsmsg_add_u32(r, "qmon", tda->tda_qmon); htsmsg_add_u32(r, "dumpmux", tda->tda_dump_muxes); @@ -178,6 +179,9 @@ extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque) s = http_arg_get(&hc->hc_req_args, "idlescan"); dvb_adapter_set_idlescan(tda, !!s); + s = http_arg_get(&hc->hc_req_args, "idleclose"); + dvb_adapter_set_idleclose(tda, !!s); + s = http_arg_get(&hc->hc_req_args, "skip_checksubscr"); dvb_adapter_set_skip_checksubscr(tda, !!s); diff --git a/src/webui/static/app/dvb.js b/src/webui/static/app/dvb.js index 34957e9c..998074c1 100644 --- a/src/webui/static/app/dvb.js +++ b/src/webui/static/app/dvb.js @@ -1075,7 +1075,7 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) { root : 'dvbadapters' }, [ 'name', 'automux', 'skip_initialscan', 'idlescan', 'diseqcversion', 'qmon', 'skip_checksubscr', 'dumpmux', 'poweroff', 'sidtochan', 'nitoid', - 'extrapriority', 'disable_pmt_monitor' ]); + 'extrapriority', 'disable_pmt_monitor', 'idleclose' ]); function saveConfForm() { confform.getForm().submit({ @@ -1105,6 +1105,10 @@ tvheadend.dvb_adapter_general = function(adapterData, satConfStore) { fieldLabel : 'Idle scanning', name : 'idlescan' }), + new Ext.form.Checkbox({ + fieldLabel : 'Close device handle when idle', + name : 'idleclose' + }), new Ext.form.Checkbox({ fieldLabel : 'Skip service availability check when mapping', name : 'skip_checksubscr'