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