73 if (currentThreadHolder ==
nullptr)
76 return currentThreadHolder;
82 currentThreadHolder->
value =
this;
104 currentThreadHolder->
value.releaseCurrentThreadStorage();
108 auto shouldDeleteThis = deleteOnThreadEnd;
111 if (shouldDeleteThis)
185 return currentThread->threadShouldExit();
221 if (timeOutMilliseconds != 0)
271 isAndroidRealtimeThread = isRealtime;
328 anon->deleteOnThreadEnd =
true;
337 for (
int i = 20; --
i >= 0;)
364 void runTest()
override
369 expect (numElementsInArray(a1) == 7);
371 expect (numElementsInArray(a2) == 3);
377 beginTest (
"Atomic int");
378 AtomicTester <int>::testInteger (*this);
379 beginTest (
"Atomic unsigned int");
380 AtomicTester <unsigned int>::testInteger (*this);
381 beginTest (
"Atomic int32");
382 AtomicTester <int32>::testInteger (*this);
383 beginTest (
"Atomic uint32");
384 AtomicTester <uint32>::testInteger (*this);
385 beginTest (
"Atomic long");
386 AtomicTester <long>::testInteger (*this);
387 beginTest (
"Atomic int*");
388 AtomicTester <int*>::testInteger (*this);
389 beginTest (
"Atomic float");
390 AtomicTester <float>::testFloat (*this);
391 #if ! JUCE_64BIT_ATOMICS_UNAVAILABLE
392 beginTest (
"Atomic int64");
393 AtomicTester <int64>::testInteger (*this);
394 beginTest (
"Atomic uint64");
395 AtomicTester <uint64>::testInteger (*this);
396 beginTest (
"Atomic double");
397 AtomicTester <double>::testFloat (*this);
399 beginTest (
"Atomic pointer increment/decrement");
400 Atomic<int*>
a (a2);
int*
b (a2);
404 beginTest (
"Atomic void*");
405 Atomic<void*> atomic;
408 atomic.set ((
void*) 10);
411 expect (atomic.value ==
c);
412 expect (atomic.get() ==
c);
416 template <
typename Type>
422 static void testInteger (UnitTest&
test)
430 test.expect (
a.value ==
c);
431 test.expect (
a.get() ==
c);
435 test.expect (
a.get() ==
c);
440 test.expect (
a.get() ==
c);
446 test.expect (
a.get() ==
c);
454 static void testFloat (UnitTest&
test)
463 test.expect (
a.get() == (Type) 101);
464 test.expect (!
a.compareAndSetBool ((Type) 300, (Type) 200));
465 test.expect (
a.get() == (Type) 101);
466 test.expect (
a.compareAndSetBool ((Type) 200,
a.get()));
467 test.expect (
a.get() == (Type) 200);
469 test.expect (
a.exchange ((Type) 300) == (Type) 200);
470 test.expect (
a.get() == (Type) 300);
473 test.expect (
b.get() ==
a.get());
478static AtomicTests atomicUnitTests;
481class ThreadLocalValueUnitTest :
public UnitTest,
485 ThreadLocalValueUnitTest()
486 : UnitTest (
"ThreadLocalValue", UnitTestCategories::threads),
487 Thread (
"ThreadLocalValue Thread")
490 void runTest()
override
492 beginTest (
"values are thread local");
495 ThreadLocalValue<int> threadLocal;
497 sharedThreadLocal = &threadLocal;
499 sharedThreadLocal.get()->get() = 1;
502 signalThreadShouldExit();
503 waitForThreadToExit (-1);
505 mainThreadResult = sharedThreadLocal.get()->get();
507 expectEquals (mainThreadResult.get(), 1);
508 expectEquals (auxThreadResult.get(), 2);
511 beginTest (
"values are per-instance");
514 ThreadLocalValue<int>
a,
b;
519 expectEquals (
a.get(), 1);
520 expectEquals (
b.get(), 2);
525 Atomic<int> mainThreadResult, auxThreadResult;
526 Atomic<ThreadLocalValue<int>*> sharedThreadLocal;
530 sharedThreadLocal.get()->get() = 2;
531 auxThreadResult = sharedThreadLocal.get()->get();
535ThreadLocalValueUnitTest threadLocalValueUnitTest;
#define noexcept
Definition DistrhoDefines.h:72
uint8_t a
Definition Spc_Cpu.h:141
uint64_t uint64
Definition basics.h:92
uint16_t uint16
Definition basics.h:88
uint32_t uint32
Definition basics.h:90
static void run(LV2_Handle instance, uint32_t n_samples)
Definition bindings_test_plugin.c:112
static uint16 swap(uint16 value) noexcept
Definition ByteOrder.h:151
static void JUCE_CALLTYPE writeToLog(const String &message)
Definition juce_Logger.cpp:40
static bool JUCE_CALLTYPE isRunningUnderDebugger() noexcept
Definition juce_Thread.cpp:347
ReferenceCountedObject()=default
Definition juce_ReferenceCountedObject.h:247
Definition juce_SpinLock.h:42
void enter() const noexcept
Definition juce_Thread.cpp:333
bool tryEnter() const noexcept
Definition juce_SpinLock.h:59
GenericScopedLock< SpinLock > ScopedLockType
Definition juce_SpinLock.h:73
Definition juce_String.h:53
Definition juce_Thread.h:181
bool setPriority(int priority)
Definition juce_Thread.cpp:253
size_t threadStackSize
Definition juce_Thread.h:391
static void JUCE_CALLTYPE setCurrentThreadAffinityMask(uint32 affinityMask)
Definition juce_posix_SharedCode.h:1047
void setAffinityMask(uint32 affinityMask)
Definition juce_Thread.cpp:288
void * ThreadID
Definition juce_Thread.h:304
virtual ~Thread()
Definition juce_Thread.cpp:31
static Thread *JUCE_CALLTYPE getCurrentThread()
Definition juce_Thread.cpp:160
Atomic< void * > threadHandle
Definition juce_Thread.h:386
void startThread()
Definition juce_Thread.cpp:122
void launchThread()
Definition juce_posix_SharedCode.h:918
CriticalSection startStopLock
Definition juce_Thread.h:388
ListenerList< Listener, Array< Listener *, CriticalSection > > listeners
Definition juce_Thread.h:395
void threadEntryPoint()
Definition juce_Thread.cpp:79
bool wait(int timeOutMilliseconds) const
Definition juce_Thread.cpp:299
ThreadID getThreadId() const noexcept
Definition juce_Thread.cpp:165
bool waitForThreadToExit(int timeOutMilliseconds) const
Definition juce_Thread.cpp:190
static void JUCE_CALLTYPE yield()
Definition juce_posix_SharedCode.h:1033
@ realtimeAudioPriority
Definition juce_Thread.h:224
Thread(const String &threadName, size_t threadStackSize=0)
Definition juce_Thread.cpp:26
static bool currentThreadShouldExit()
Definition juce_Thread.cpp:182
bool threadShouldExit() const
Definition juce_Thread.cpp:177
bool deleteOnThreadEnd
Definition juce_Thread.h:393
void killThread()
Definition juce_posix_SharedCode.h:963
WaitableEvent defaultEvent
Definition juce_Thread.h:389
static ThreadID JUCE_CALLTYPE getCurrentThreadId()
Definition juce_posix_SharedCode.h:1028
WaitableEvent startSuspensionEvent
Definition juce_Thread.h:389
static bool setThreadPriority(void *, int)
Definition juce_posix_SharedCode.h:993
bool stopThread(int timeOutMilliseconds)
Definition juce_Thread.cpp:208
void notify() const
Definition juce_Thread.cpp:304
static void JUCE_CALLTYPE setCurrentThreadName(const String &newThreadName)
Definition juce_posix_SharedCode.h:975
void addListener(Listener *)
Definition juce_Thread.cpp:242
static int getAdjustedPriority(int)
Definition juce_Thread.cpp:293
friend void JUCE_API juce_threadEntryPoint(void *)
Definition juce_Thread.cpp:116
Atomic< int32 > shouldExit
Definition juce_Thread.h:394
void signalThreadShouldExit()
Definition juce_Thread.cpp:171
Atomic< ThreadID > threadId
Definition juce_Thread.h:387
int threadPriority
Definition juce_Thread.h:390
static bool setCurrentThreadPriority(int priority)
Definition juce_Thread.cpp:283
bool isThreadRunning() const
Definition juce_Thread.cpp:155
uint32 affinityMask
Definition juce_Thread.h:392
const String threadName
Definition juce_Thread.h:385
void removeListener(Listener *)
Definition juce_Thread.cpp:247
static void launch(std::function< void()> functionToRun)
Definition juce_Thread.cpp:325
static void JUCE_CALLTYPE sleep(int milliseconds)
Definition juce_posix_SharedCode.h:44
Definition juce_ThreadLocalValue.h:48
static uint32 getMillisecondCounter() noexcept
Definition juce_Time.cpp:241
Definition juce_UnitTest.h:70
int * l
Definition inflate.c:1579
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned f
Definition inflate.c:1572
static const char * name
Definition pugl.h:1582
#define JUCE_API
Definition juce_StandardHeader.h:152
Definition juce_UnitTestCategories.h:27
Definition carla_juce.cpp:31
JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger() noexcept
Definition juce_linux_SystemStats.cpp:348
CriticalSection::ScopedLockType ScopedLock
Definition juce_CriticalSection.h:186
unsigned int uint32
Definition juce_MathsFunctions.h:45
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Definition juce_MathsFunctions.h:262
static CurrentThreadHolder::Ptr getCurrentThreadHolder()
Definition juce_Thread.cpp:68
static char currentThreadHolderLock[sizeof(SpinLock)]
Definition juce_Thread.cpp:61
static SpinLock * castToSpinLockWithoutAliasingWarning(void *s)
Definition juce_Thread.cpp:63
Type
Definition Lv2Ports.h:60
static int test(SerdEnv *env, bool top_level, bool pretty_numbers)
Definition sratom_test.c:79
Definition juce_Thread.cpp:52
ThreadLocalValue< Thread * > value
Definition juce_Thread.cpp:56
CurrentThreadHolder() noexcept
Definition juce_Thread.cpp:53
ReferenceCountedObjectPtr< CurrentThreadHolder > Ptr
Definition juce_Thread.cpp:55
Definition juce_Thread.cpp:311
LambdaThread(std::function< void()> f)
Definition juce_Thread.cpp:312
void run() override
Definition juce_Thread.cpp:314
std::function< void()> fn
Definition juce_Thread.cpp:320
const char const char const char const char char * fn
Definition swell-functions.h:168
void DWORD stackSize
Definition swell-functions.h:807
return c
Definition crypt.c:175
#define void
Definition unzip.h:396
#define const
Definition zconf.h:137