Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
Threading.cpp
Go to the documentation of this file.
1
/*
2
* This file is part of Project SkyFire https://www.projectskyfire.org.
3
* See LICENSE.md file for Copyright information
4
*/
5
6
#include "
Errors.h
"
7
#include "
Platform/TimeUtils.h
"
8
#include "
Threading.h
"
9
#include <functional>
10
11
using namespace
Skyfire
;
12
13
ThreadPriority::ThreadPriority
()
14
{
15
for
(
int
i =
Idle
; i <
MAXPRIORITYNUM
; ++i)
16
m_priority
[i] = i;
17
}
18
19
int
ThreadPriority::getPriority
(
Priority
p)
const
20
{
21
if
(p <
Idle
)
22
p =
Idle
;
23
24
if
(p >
Realtime
)
25
p =
Realtime
;
26
27
return
m_priority
[p];
28
}
29
30
Thread::Thread
() :
m_iThreadId
(0),
m_task
(0),
m_started
(false) { }
31
32
Thread::Thread
(
Runnable
* instance) :
m_iThreadId
(0),
m_task
(instance),
m_started
(false)
33
{
34
// register reference to m_task to prevent it deletion until destructor
35
if
(
m_task
)
36
m_task
->incReference();
37
38
bool
_start =
start
();
39
ASSERT
(_start);
40
}
41
42
Thread::~Thread
()
43
{
44
if
(
m_thread
.joinable())
45
m_thread
.detach();
46
47
// deleted runnable object (if no other references)
48
if
(
m_task
)
49
m_task
->decReference();
50
}
51
52
bool
Thread::start
()
53
{
54
if
(
m_task
== 0 ||
m_started
)
55
return
false
;
56
57
// incRef before spawning the thread, otherwise Thread::ThreadTask() might call decRef and delete m_task
58
m_task
->incReference();
59
60
try
61
{
62
m_thread
= std::thread(&
Thread::ThreadTask
,
m_task
);
63
m_iThreadId
= std::hash<std::thread::id>()(
m_thread
.get_id());
64
m_started
=
true
;
65
}
66
catch
(...)
67
{
68
m_task
->decReference();
69
return
false
;
70
}
71
72
return
true
;
73
}
74
75
bool
Thread::wait
()
76
{
77
if
(!
m_thread
.joinable())
78
return
false
;
79
80
m_thread
.join();
81
82
m_iThreadId
= 0;
83
m_started
=
false
;
84
85
return
true
;
86
}
87
88
void
Thread::destroy
()
89
{
90
if
(
m_thread
.joinable())
91
m_thread
.detach();
92
93
m_iThreadId
= 0;
94
m_started
=
false
;
95
}
96
97
void
Thread::suspend
()
98
{
99
}
100
101
void
Thread::resume
()
102
{
103
}
104
105
void
Thread::ThreadTask
(
Runnable
* param)
106
{
107
Runnable
* _task = param;
108
_task->
run
();
109
110
// task execution complete, free reference added at start()
111
_task->
decReference
();
112
}
113
114
uint64_t
Thread::currentId
()
115
{
116
return
std::hash<std::thread::id>()(std::this_thread::get_id());
117
}
118
119
std::thread::native_handle_type
Thread::currentHandle
()
120
{
121
return
std::thread::native_handle_type();
122
}
123
124
Thread
*
Thread::current
()
125
{
126
static
thread_local
Thread
thread;
127
if
(!thread.
m_started
)
128
{
129
thread.
m_iThreadId
=
Thread::currentId
();
130
thread.
m_started
=
true
;
131
}
132
133
return
&thread;
134
}
135
136
void
Thread::setPriority
(
Priority
type)
137
{
138
(void)type;
139
}
140
141
void
Thread::Sleep
(
unsigned
long
msecs)
142
{
143
SleepForMilliseconds
(
uint32
(msecs));
144
}
uint32
std::uint32_t uint32
Definition
Define.h:77
Errors.h
ASSERT
#define ASSERT
Definition
Errors.h:29
Threading.h
MAXPRIORITYNUM
#define MAXPRIORITYNUM
Definition
Threading.h:45
TimeUtils.h
Skyfire::Runnable
Definition
Threading.h:18
Skyfire::Runnable::decReference
void decReference()
Definition
Threading.h:25
Skyfire::Runnable::run
virtual void run()=0
Skyfire::Thread::current
static Thread * current()
Definition
Threading.cpp:124
Skyfire::Thread::wait
bool wait()
Definition
Threading.cpp:75
Skyfire::Thread::~Thread
~Thread()
Definition
Threading.cpp:42
Skyfire::Thread::setPriority
void setPriority(Priority type)
Definition
Threading.cpp:136
Skyfire::Thread::destroy
void destroy()
Definition
Threading.cpp:88
Skyfire::Thread::m_thread
std::thread m_thread
Definition
Threading.h:85
Skyfire::Thread::ThreadTask
static void ThreadTask(Runnable *param)
Definition
Threading.cpp:105
Skyfire::Thread::Thread
Thread()
Definition
Threading.cpp:30
Skyfire::Thread::suspend
void suspend()
Definition
Threading.cpp:97
Skyfire::Thread::currentHandle
static std::thread::native_handle_type currentHandle()
Definition
Threading.cpp:119
Skyfire::Thread::resume
void resume()
Definition
Threading.cpp:101
Skyfire::Thread::m_started
bool m_started
Definition
Threading.h:87
Skyfire::Thread::m_iThreadId
uint64_t m_iThreadId
Definition
Threading.h:84
Skyfire::Thread::start
bool start()
Definition
Threading.cpp:52
Skyfire::Thread::currentId
static uint64_t currentId()
Definition
Threading.cpp:114
Skyfire::Thread::m_task
Runnable * m_task
Definition
Threading.h:86
Skyfire::Thread::Sleep
static void Sleep(unsigned long msecs)
Definition
Threading.cpp:141
Skyfire::ThreadPriority::getPriority
int getPriority(Priority p) const
Definition
Threading.cpp:19
Skyfire::ThreadPriority::ThreadPriority
ThreadPriority()
Definition
Threading.cpp:13
Skyfire::ThreadPriority::m_priority
int m_priority[MAXPRIORITYNUM]
Definition
Threading.h:54
Skyfire
Definition
AuthPatchTransfer.h:12
Skyfire::Priority
Priority
Definition
Threading.h:35
Skyfire::Realtime
@ Realtime
Definition
Threading.h:42
Skyfire::Idle
@ Idle
Definition
Threading.h:36
Skyfire::SleepForMilliseconds
void SleepForMilliseconds(uint32 milliseconds)
Definition
TimeUtils.h:42
src
server
shared
Threading
Threading.cpp
Generated on
for Project SkyFire Core by
1.17.0