1 #include "thread/CheckFunction.h"
2 #include "common/Assert.h"
3 #include <thread>
4 
5 NAMESPACE_SPH_BEGIN
6 
7 const std::thread::id MAIN_THREAD_ID = std::this_thread::get_id();
8 
FunctionChecker(std::atomic<Size> & reentrantCnt,std::atomic<Size> & totalCnt,const Flags<CheckFunction> flags)9 FunctionChecker::FunctionChecker(std::atomic<Size>& reentrantCnt,
10     std::atomic<Size>& totalCnt,
11     const Flags<CheckFunction> flags)
12     : reentrantCnt(reentrantCnt)
13     , flags(flags) {
14     reentrantCnt++;
15     totalCnt++;
16 
17     if (flags.has(CheckFunction::MAIN_THREAD)) {
18         SPH_ASSERT(std::this_thread::get_id() == MAIN_THREAD_ID, "Called from different thread");
19     }
20     if (flags.has(CheckFunction::NOT_MAIN_THREAD)) {
21         SPH_ASSERT(std::this_thread::get_id() != MAIN_THREAD_ID, "Called from main thread");
22     }
23     if (flags.has(CheckFunction::NON_REENRANT)) {
24         SPH_ASSERT(reentrantCnt == 1, "Reentrant " + std::to_string(reentrantCnt));
25     }
26     if (flags.has(CheckFunction::ONCE)) {
27         SPH_ASSERT(totalCnt == 1, "Called more than once");
28     }
29 }
30 
~FunctionChecker()31 FunctionChecker::~FunctionChecker() {
32     reentrantCnt--;
33 
34     if (flags.has(CheckFunction::NO_THROW)) {
35         SPH_ASSERT(!std::uncaught_exception(), "Function threw an exception");
36     }
37 }
38 
isMainThread()39 bool isMainThread() {
40     return std::this_thread::get_id() == MAIN_THREAD_ID;
41 }
42 
43 NAMESPACE_SPH_END
44