summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2017-03-19 13:11:39 +0100
committerKlaus Schmidinger <vdr@tvdr.de>2017-03-19 13:11:39 +0100
commit367557039aae419f28c2ff44700f77bec8f498e4 (patch)
tree2626da5314a55097b697da75a0dd8bf646b910b3
parent31b0feae145a943e4fb99d5fa2e2f83466516606 (diff)
downloadvdr-367557039aae419f28c2ff44700f77bec8f498e4.tar.gz
vdr-367557039aae419f28c2ff44700f77bec8f498e4.tar.bz2
The function cRingBufferLinear::Clear() can now be called safely from the reading thread, without additional locking
-rw-r--r--HISTORY4
-rw-r--r--ringbuffer.c7
-rw-r--r--ringbuffer.h4
3 files changed, 10 insertions, 5 deletions
diff --git a/HISTORY b/HISTORY
index 98848c6b..23e445ef 100644
--- a/HISTORY
+++ b/HISTORY
@@ -8882,7 +8882,7 @@ Video Disk Recorder Revision History
- Added a short sleep to cTSBuffer::Action() to avoid high CPU usage (thanks to
Sergey Chernyavskiy).
-2017-03-18: Version 2.3.3
+2017-03-19: Version 2.3.3
- Added 'S3W ABS-3A' to sources.conf (thanks to Frank Richter).
- Fixed a possible deadlock in the recordings handler thread.
@@ -8918,3 +8918,5 @@ Video Disk Recorder Revision History
that is capable of decrypting more than one channel ("Multi Channel Decryption")
to decrypt channels from different transponders. See the remarks in mtd.h on
what a derived cCamSlot class needs to do in order to activate MTD.
+- The function cRingBufferLinear::Clear() can now be called safely from the
+ reading thread, without additional locking.
diff --git a/ringbuffer.c b/ringbuffer.c
index d33a4719..902c8878 100644
--- a/ringbuffer.c
+++ b/ringbuffer.c
@@ -7,7 +7,7 @@
* Parts of this file were inspired by the 'ringbuffy.c' from the
* LinuxDVB driver (see linuxtv.org).
*
- * $Id: ringbuffer.c 4.1 2016/12/22 10:26:13 kls Exp $
+ * $Id: ringbuffer.c 4.2 2017/03/19 12:43:36 kls Exp $
*/
#include "ringbuffer.h"
@@ -216,9 +216,10 @@ int cRingBufferLinear::Available(void)
void cRingBufferLinear::Clear(void)
{
- tail = head = margin;
+ int Head = head;
+ tail = Head;
#ifdef DEBUGRINGBUFFERS
- lastHead = head;
+ lastHead = Head;
lastTail = tail;
lastPut = lastGet = -1;
#endif
diff --git a/ringbuffer.h b/ringbuffer.h
index 9699bbc8..746fc51e 100644
--- a/ringbuffer.h
+++ b/ringbuffer.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: ringbuffer.h 4.1 2016/12/22 10:26:13 kls Exp $
+ * $Id: ringbuffer.h 4.2 2017/03/19 13:11:39 kls Exp $
*/
#ifndef __RINGBUFFER_H
@@ -80,6 +80,8 @@ public:
virtual int Free(void) { return Size() - Available() - 1 - margin; }
virtual void Clear(void);
///< Immediately clears the ring buffer.
+ ///< This function may safely be called from the reading thread without additional
+ ///< locking. If called from the writing thread, proper locking must be used.
int Read(int FileHandle, int Max = 0);
///< Reads at most Max bytes from FileHandle and stores them in the
///< ring buffer. If Max is 0, reads as many bytes as possible.