[vdr] Device bonding
Juergen Lock
vdr-l at jelal.kn-bremen.de
Sun Feb 17 16:34:25 CET 2013
On Sat, Feb 16, 2013 at 04:46:36PM +0100, Juergen Lock wrote:
> Hi!
>
> [...]
> 3. Running with these four tuners (dual DVB-T and the bonded two DVB-S2)
> I get two different deadlocks waiting for cDvbTuner::bondMutex
> after live viewing a DVB-T(!) channel for longer (OSD doesn't
> react anymore and attaching gdb reveals two threads waiting for
> bondMutex) - the following two changes make it work but there
> probably is a better fix: (patch may apply with offsets; one
> of the problems I think is a lock order reversal with cDvbTuner::mutex
> and bondMutex when cDvbTuner::SetChannel calls back into itself
> with bondMutex held.)
>
> --- dvbdevice.c.orig
> +++ dvbdevice.c
> @@ -476,8 +476,10 @@ void cDvbTuner::SetChannel(const cChanne
> t->SetChannel(NULL);
> }
> }
> - else if (strcmp(GetBondingParams(Channel), BondedMaster->GetBondingParams()) != 0)
> + else if (strcmp(GetBondingParams(Channel), BondedMaster->GetBondingParams()) != 0) {
> + bondMutex.Unlock();
> BondedMaster->SetChannel(Channel);
> + }
> }
> cMutexLock MutexLock(&mutex);
> if (!IsTunedTo(Channel))
> @@ -761,7 +773,12 @@ bool cDvbTuner::SetFrontend(void)
> tone = SEC_TONE_ON;
> }
> int volt = (dtp.Polarization() == 'V' || dtp.Polarization() == 'R') ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18;
> - if (GetBondedMaster() != this) {
> +#if 1
> + if (bondedTuner && !bondedMaster)
> +#else
> + if (GetBondedMaster() != this)
> +#endif
> + {
> tone = SEC_TONE_OFF;
> volt = SEC_VOLTAGE_13;
> }
>
Hmm looks like I posted too soon, the first hunk is actually too much
and causes other deadlocks (like when trying to play a DVB-S channel
via streamdev while live viewing another), so the patch I'm not testing
becomes:
--- dvbdevice.c.orig
+++ dvbdevice.c
@@ -761,7 +773,12 @@ bool cDvbTuner::SetFrontend(void)
tone = SEC_TONE_ON;
}
int volt = (dtp.Polarization() == 'V' || dtp.Polarization() == 'R') ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18;
- if (GetBondedMaster() != this) {
+#if 1
+ if (bondedTuner && !bondedMaster)
+#else
+ if (GetBondedMaster() != this)
+#endif
+ {
tone = SEC_TONE_OFF;
volt = SEC_VOLTAGE_13;
}
Sorry,
Juergen
More information about the vdr
mailing list