1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

The function cRingBufferLinear::Clear() can now be called safely from the reading thread, without additional locking

This commit is contained in:
Klaus Schmidinger 2017-03-19 13:11:39 +01:00
parent 31b0feae14
commit 367557039a
3 changed files with 10 additions and 5 deletions

View File

@ -8882,7 +8882,7 @@ Video Disk Recorder Revision History
- Added a short sleep to cTSBuffer::Action() to avoid high CPU usage (thanks to - Added a short sleep to cTSBuffer::Action() to avoid high CPU usage (thanks to
Sergey Chernyavskiy). 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). - Added 'S3W ABS-3A' to sources.conf (thanks to Frank Richter).
- Fixed a possible deadlock in the recordings handler thread. - 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") 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 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. 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.

View File

@ -7,7 +7,7 @@
* Parts of this file were inspired by the 'ringbuffy.c' from the * Parts of this file were inspired by the 'ringbuffy.c' from the
* LinuxDVB driver (see linuxtv.org). * 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" #include "ringbuffer.h"
@ -216,9 +216,10 @@ int cRingBufferLinear::Available(void)
void cRingBufferLinear::Clear(void) void cRingBufferLinear::Clear(void)
{ {
tail = head = margin; int Head = head;
tail = Head;
#ifdef DEBUGRINGBUFFERS #ifdef DEBUGRINGBUFFERS
lastHead = head; lastHead = Head;
lastTail = tail; lastTail = tail;
lastPut = lastGet = -1; lastPut = lastGet = -1;
#endif #endif

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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 #ifndef __RINGBUFFER_H
@ -80,6 +80,8 @@ public:
virtual int Free(void) { return Size() - Available() - 1 - margin; } virtual int Free(void) { return Size() - Available() - 1 - margin; }
virtual void Clear(void); virtual void Clear(void);
///< Immediately clears the ring buffer. ///< 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); int Read(int FileHandle, int Max = 0);
///< Reads at most Max bytes from FileHandle and stores them in the ///< Reads at most Max bytes from FileHandle and stores them in the
///< ring buffer. If Max is 0, reads as many bytes as possible. ///< ring buffer. If Max is 0, reads as many bytes as possible.