Make closing file descriptors (when idle) optional, it breaks some (i.e. my) cards.

This commit is contained in:
Adam Sutton 2012-09-13 16:40:20 +01:00
parent 99f1b8f7de
commit 9ed26c1a54
4 changed files with 40 additions and 3 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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'