From patchwork Wed May 9 18:56:24 2007 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Artur Skawina X-Patchwork-Id: 12459 Received: from mx12.go2.pl ([193.17.41.142] helo=poczta.o2.pl) by www.linuxtv.org with esmtp (Exim 4.50) id 1HlrLO-0001Kg-11 for vdr@linuxtv.org; Wed, 09 May 2007 20:57:00 +0200 Received: from poczta.o2.pl (mx12 [127.0.0.1]) by poczta.o2.pl (Postfix) with ESMTP id A654E3E80FE for ; Wed, 9 May 2007 20:56:25 +0200 (CEST) Received: from dki146.neoplus.adsl.tpnet.pl (dki146.neoplus.adsl.tpnet.pl [83.24.12.146]) by poczta.o2.pl (Postfix) with ESMTP for ; Wed, 9 May 2007 20:56:25 +0200 (CEST) Received: (qmail 16763 invoked from network); 9 May 2007 18:56:25 -0000 Received: from unknown (HELO ?172.19.43.221?) (172.19.43.221) by 172.19.43.250 with SMTP; 9 May 2007 18:56:25 -0000 Message-ID: <46421958.6070104@o2.pl> Date: Wed, 09 May 2007 20:56:24 +0200 From: Artur Skawina User-Agent: Thunderbird 3.0a1 (X11/20070320) MIME-Version: 1.0 To: VDR Mailing List Subject: Re: [vdr] [PATCH] dynamically sized ringbuffers v1 References: <463FA500.4010200@o2.pl> <4640BFA8.50102@o2.pl> In-Reply-To: <4640BFA8.50102@o2.pl> X-Enigmail-Version: 0.95b X-BeenThere: vdr@linuxtv.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: VDR Mailing List List-Id: VDR Mailing List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 09 May 2007 18:57:00 -0000 Status: O X-Status: X-Keywords: X-UID: 12830 > void cRecorder::Receive(uchar *Data, int Length) > { > if (Running()) { > int p = ringBuffer->Put(Data, Length); > if (p != Length && Running()) > ringBuffer->ReportOverflow(Length - p); > } > } > > it simply drops any data that does not fit into the buffer, which would be fine > for live viewing, but isn't ideal when recording. > > Can we try harder not to loose data here? IOW can this function sleep (and retry)? It took a while to trigger the condition again, but now it happened and trying a bit harder payed off. Running vdr /w following patch resulted in this log (and no overflow): 20:31:35 vdr: [16328] buffer usage: 70% (tid=16327) 20:31:35 vdr: [16328] buffer usage: 80% (tid=16327) 20:31:35 vdr: [16328] buffer usage: 90% (tid=16327) 20:31:35 vdr: [16328] buffer usage: 100% (tid=16327) 20:31:35 vdr: [16327] Enlarging ring buffer "Result": 262144 bytes (trigger 3) 20:31:35 vdr: [16329] Enlarging ring buffer "TS": 262144 bytes (trigger 2) 20:31:35 vdr: [16328] Enlarging ring buffer "Recorder": 262144 bytes (trigger 3) 20:31:35 vdr: [16328] buffer usage: 0% (tid=16327) 20:31:35 vdr: [16328] saved extra 153 bytes in recorder ring buffer after 80 ms delay artur diff --git a/recorder.c b/recorder.c index 8bb1621..3c0e002 100644 --- a/recorder.c +++ b/recorder.c @@ -157,8 +157,20 @@ void cRecorder::Receive(uchar *Data, int Length) { if (Running()) { int p = ringBuffer->Put(Data, Length); - if (p != Length && Running()) + if (p != Length && Running()) { + for (int ms=20; ms<1000; ms+=ms) { + cCondWait::SleepMs(ms); + if (!Running()) + return; + int r = ringBuffer->Put(Data+p, Length-p); + p += r; + if (r) + dsyslog("saved extra %d bytes in recorder ring buffer after %d ms delay", r, ms); + if (p == Length || !Running()) + return; + } ringBuffer->ReportOverflow(Length - p); + } } }