From patchwork Sat Feb 16 15:46:36 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Juergen Lock X-Patchwork-Id: 16891 Received: from localhost ([127.0.0.1] helo=www.linuxtv.org) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1U6k10-00019v-87; Sat, 16 Feb 2013 16:49:26 +0100 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1U6k0b-000176-E6 for vdr@linuxtv.org; Sat, 16 Feb 2013 16:49:25 +0100 X-tubIT-Incoming-IP: 78.46.108.116 Received: from gelbbaer.kn-bremen.de ([78.46.108.116] helo=smtp.kn-bremen.de) by mail.tu-berlin.de (exim-4.75/mailfrontend-4) with esmtp for id 1U6k0b-0000zs-9z; Sat, 16 Feb 2013 16:49:01 +0100 Received: by smtp.kn-bremen.de (Postfix, from userid 10) id 7E1241E00071; Sat, 16 Feb 2013 16:49:00 +0100 (CET) Received: from triton8.kn-bremen.de (noident@localhost [127.0.0.1]) by triton8.kn-bremen.de (8.14.5/8.14.4) with ESMTP id r1GFkb2w021689; Sat, 16 Feb 2013 16:46:37 +0100 (CET) (envelope-from vdr-l@triton8.kn-bremen.de) Received: (from vdr-l@localhost) by triton8.kn-bremen.de (8.14.5/8.14.3/Submit) id r1GFkbkL021688; Sat, 16 Feb 2013 16:46:37 +0100 (CET) (envelope-from vdr-l) From: Juergen Lock Date: Sat, 16 Feb 2013 16:46:36 +0100 To: vdr@linuxtv.org Message-ID: <20130216154636.GA21094@triton8.kn-bremen.de> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2013.2.16.153917 X-PMX-Spam: Gauge=IIIIIIII, Probability=8%, Report=' HTML_00_01 0.05, HTML_00_10 0.05, BODYTEXTP_SIZE_3000_LESS 0, BODY_SIZE_2000_2999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, __ANY_URI 0, __CD 0, __CP_URI_IN_BODY 0, __CT 0, __CT_TEXT_PLAIN 0, __HAS_FROM 0, __HAS_MSGID 0, __MIME_TEXT_ONLY 0, __MIME_VERSION 0, __SANE_MSGID 0, __SUBJ_ALPHA_END 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_MAILTO 0, __URI_NO_WWW 0, __URI_NS , __USER_AGENT 0' X-LSpam-Score: -1.1 (-) X-LSpam-Report: No, score=-1.1 required=5.0 tests=BAYES_00=-1.9, RDNS_NONE=0.793 autolearn=no Cc: vdr@dolze.de Subject: [vdr] Device bonding X-BeenThere: vdr@linuxtv.org X-Mailman-Version: 2.1.13 Precedence: list Reply-To: VDR Mailing List List-Id: VDR Mailing List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: vdr-bounces@linuxtv.org Errors-To: vdr-bounces@linuxtv.org Hi! Now that I have a spare DVB-S2 tuner (TechniSat SkyStar USB HD (adapter2); the others on this box are atm Hauppauge Nova-TD model 1172 (adapter 0+1) and TechnoTrend S2-3600 (adapter3) - all USB) I decided to play with vdr device bonding. I discovered three things: (still using vdr 1.7.29, I know I should upgrade... :) 1. The LNB setup OSD menu causes bonding to fail (it's trying to bond a DVB-T tuner) if I set the two DVB-S2 tuners as "connected to sat cable 1"; it works with "sat cable 2". Maybe it somehow thinks of (one of?) the DVB-T tuner(s) as cable 1 too? 2. The infosatepg plugin doesn't check MaySwitchTransponder() and thus grabs a bonded device when it shouldn't, I just patched that in the FreeBSD port: (plugin maintainer Cc'd) http://svnweb.freebsd.org/ports/head/multimedia/vdr-plugin-infosatepg/files/patch-infosatepg.cpp?r1=300896&r2=312357 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.) Thanx, Juergen --- 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; }