-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathforeign_thread_manager.cpp
More file actions
95 lines (80 loc) · 1.61 KB
/
foreign_thread_manager.cpp
File metadata and controls
95 lines (80 loc) · 1.61 KB
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "jlcxx/jlcxx.hpp"
#include "foreign_thread_manager.hpp"
namespace qmlwrap
{
QMutex ForeignThreadManager::m_juliamutex;
thread_local ForeignThreadManager* ForeignThreadManager::m_instance = nullptr;
ForeignThreadManager& ForeignThreadManager::instance()
{
if (m_instance == nullptr)
{
m_instance = new ForeignThreadManager();
}
return *m_instance;
}
ForeignThreadManager::~ForeignThreadManager()
{
gc_safe_leave();
}
ForeignThreadManager::ForeignThreadManager()
{
if (!QThread::isMainThread())
{
#if (JULIA_VERSION_MAJOR * 100 + JULIA_VERSION_MINOR) >= 109
jl_adopt_thread();
#endif
}
gc_safe_enter();
}
void ForeignThreadManager::gc_safe_enter()
{
jl_ptls_t ptls = jl_current_task->ptls;
m_state = jl_gc_safe_enter(ptls);
#if (JULIA_VERSION_MAJOR * 100 + JULIA_VERSION_MINOR) > 111
ptls->engine_nqueued++;
#endif
}
void ForeignThreadManager::gc_safe_leave()
{
jl_ptls_t ptls = jl_current_task->ptls;
jl_gc_safe_leave(ptls, m_state);
#if (JULIA_VERSION_MAJOR * 100 + JULIA_VERSION_MINOR) > 111
ptls->engine_nqueued--;
#endif
}
void ForeignThreadManager::begin_julia()
{
if(m_depth == 0)
{
m_juliamutex.lock();
gc_safe_leave();
}
++m_depth;
}
void ForeignThreadManager::end_julia()
{
--m_depth;
if(m_depth == 0)
{
gc_safe_enter();
m_juliamutex.unlock();
}
}
void ForeignThreadManager::cleanup()
{
if(!QThread::isMainThread())
{
return;
}
delete m_instance;
m_instance = nullptr;
}
GCGuard::GCGuard()
{
ForeignThreadManager::instance().begin_julia();
}
GCGuard::~GCGuard()
{
ForeignThreadManager::instance().end_julia();
}
}