OpenShot Audio Library | OpenShotAudio  0.3.0
juce_ReadWriteLock.h
1 /*
2  ==============================================================================
3 
4  This file is part of the JUCE library.
5  Copyright (c) 2017 - ROLI Ltd.
6 
7  JUCE is an open source library subject to commercial or open-source
8  licensing.
9 
10  The code included in this file is provided under the terms of the ISC license
11  http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12  To use, copy, modify, and/or distribute this software for any purpose with or
13  without fee is hereby granted provided that the above copyright notice and
14  this permission notice appear in all copies.
15 
16  JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17  EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18  DISCLAIMED.
19 
20  ==============================================================================
21 */
22 
23 namespace juce
24 {
25 
26 //==============================================================================
47 class JUCE_API ReadWriteLock
48 {
49 public:
50  //==============================================================================
54  ReadWriteLock() noexcept;
55 
59  ~ReadWriteLock() noexcept;
60 
61  //==============================================================================
69  void enterRead() const noexcept;
70 
79  bool tryEnterRead() const noexcept;
80 
91  void exitRead() const noexcept;
92 
93  //==============================================================================
101  void enterWrite() const noexcept;
102 
111  bool tryEnterWrite() const noexcept;
112 
123  void exitWrite() const noexcept;
124 
125 
126 private:
127  //==============================================================================
128  SpinLock accessLock;
129  WaitableEvent readWaitEvent, writeWaitEvent;
130  mutable int numWaitingWriters = 0, numWriters = 0;
131  mutable Thread::ThreadID writerThreadId = {};
132 
133  struct ThreadRecursionCount
134  {
135  Thread::ThreadID threadID;
136  int count;
137  };
138 
139  mutable Array <ThreadRecursionCount> readerThreads;
140 
141  bool tryEnterWriteInternal (Thread::ThreadID) const noexcept;
142 
143  JUCE_DECLARE_NON_COPYABLE (ReadWriteLock)
144 };
145 
146 } // namespace juce
void * ThreadID
Definition: juce_Thread.h:304