Commit Message
On 18.02.2013 23:51, Juergen Lock wrote:
> On Sun, Feb 17, 2013 at 04:34:25PM +0100, Juergen Lock wrote:
>> 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
>
> .. I'm _now_ 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;
>> }
>>
Can you please test whether this one works just as well?
Klaus
@@ -742,7 +742,7 @@
if (const cDiseqc *diseqc = Diseqcs.Get(device->CardIndex() + 1, channel.Source(), frequency, dtp.Polarization(), &scr)) {
frequency -= diseqc->Lof();
if (diseqc != lastDiseqc || diseqc->IsScr()) {
- if (GetBondedMaster() == this) {
+ if (bondedMaster) {
ExecuteDiseqc(diseqc, &frequency);
if (frequency == 0)
return false;
@@ -768,7 +768,7 @@
tone = SEC_TONE_ON;
}
int volt = (dtp.Polarization() == 'V' || dtp.Polarization() == 'R') ? SEC_VOLTAGE_13 : SEC_VOLTAGE_18;
- if (GetBondedMaster() != this) {
+ if (!bondedMaster) {
tone = SEC_TONE_OFF;
volt = SEC_VOLTAGE_13;
}