summaryrefslogtreecommitdiff
path: root/lib/hkStubs/Havok/Common/Base/DebugUtil/MultiThreadCheck/hkMultiThreadCheck.h
blob: a591dc105256a4a46212938c9d67eeac5f7731e7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#pragma once

#include <Havok/Common/Base/System/StackTracer/hkStackTracer.h>
#include <Havok/Common/Base/hkBase.h>

class hkCriticalSection;

class hkMultiThreadCheck {
public:
    HK_DECLARE_CLASS_ALLOCATOR(hkMultiThreadCheck)
    HK_DECLARE_REFLECTION()

    enum AccessType {
        HK_ACCESS_IGNORE = 0,
        HK_ACCESS_RO = 1,
        HK_ACCESS_RW = 2,
    };

    enum ReadMode {
        THIS_OBJECT_ONLY,
        RECURSIVE,
    };

    enum : hkUint32 {
        MARKED_RO = 0xffffffe1,  // and all children
        MARKED_RO_SELF_ONLY = 0xffffffc1,
        UNMARKED = 0xfffffff1
    };

    HK_FORCE_INLINE hkMultiThreadCheck();

    HK_FORCE_INLINE void init();

    HK_FORCE_INLINE void markForRead(ReadMode mode = RECURSIVE) {}
    HK_FORCE_INLINE void markForWrite() {}
    HK_FORCE_INLINE bool isMarkedForWrite() { return true; }
    HK_FORCE_INLINE bool isMarkedForReadRecursive() { return true; }
    HK_FORCE_INLINE void unmarkForRead() {}
    HK_FORCE_INLINE void unmarkForWrite() {}

    hkUint32 m_threadId;
    static hkStackTracer s_stackTracer;
    static hkStackTracer::CallTree* s_stackTree;
    int m_stackTraceId;
    hkUint16 m_markCount;
    static hkCriticalSection* m_criticalSection;
    static void globalCriticalSectionLock();
    static void globalCriticalSectionUnlock();

protected:
    hkUint16 m_markBitStack;
};

inline hkMultiThreadCheck::hkMultiThreadCheck() : m_threadId(UNMARKED), m_markCount(0x8000) {}

inline void hkMultiThreadCheck::init() {
    m_threadId = UNMARKED;
    m_markCount = 0x8000;
}