Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
MapUpdater.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 "
DatabaseEnv.h
"
7
#include "
DelayExecutor.h
"
8
#include "
Log.h
"
9
#include "
Map.h
"
10
#include "
MapUpdater.h
"
11
#include "
RuntimeMetrics.h
"
12
#include "
Util.h
"
13
14
class
WDBThreadStartReq1
:
public
DelayTask
15
{
16
public
:
17
WDBThreadStartReq1
() { }
18
19
virtual
int
call
() {
return
0; }
20
};
21
22
class
WDBThreadEndReq1
:
public
DelayTask
23
{
24
public
:
25
WDBThreadEndReq1
() { }
26
27
virtual
int
call
() {
return
0; }
28
};
29
30
class
MapUpdateRequest
:
public
DelayTask
31
{
32
private
:
33
Map
&
m_map
;
34
MapUpdater
&
m_updater
;
35
uint32
m_diff
;
36
37
public
:
38
MapUpdateRequest
(
Map
& m,
MapUpdater
& u,
uint32
d)
39
:
m_map
(m),
m_updater
(u),
m_diff
(d) { }
40
41
virtual
int
call
()
42
{
43
m_map
.Update(
m_diff
);
44
m_updater
.update_finished();
45
return
0;
46
}
47
};
48
49
MapUpdater::MapUpdater
() :
50
m_executor
(),
pending_requests
(0) { }
51
52
MapUpdater::~MapUpdater
()
53
{
54
deactivate
();
55
}
56
57
int
MapUpdater::activate
(
size_t
num_threads)
58
{
59
return
m_executor
.start((
int
)num_threads, std::unique_ptr<DelayTask>(
new
WDBThreadStartReq1
), std::unique_ptr<DelayTask>(
new
WDBThreadEndReq1
));
60
}
61
62
int
MapUpdater::deactivate
()
63
{
64
wait
();
65
return
m_executor
.deactivate();
66
}
67
68
int
MapUpdater::wait
()
69
{
70
uint32
const
waitStart =
getMSTime
();
71
bool
waited =
false
;
72
std::unique_lock<std::mutex> ulock(
Lock
);
73
74
while
(
pending_requests
> 0)
75
{
76
waited =
true
;
77
condition
.wait(ulock);
78
}
79
80
ulock.unlock();
81
82
if
(waited)
83
Skyfire::Diagnostics::GetRuntimeMetrics
().
RecordMapUpdateWait
(
getMSTimeDiff
(waitStart,
getMSTime
()));
84
85
return
0;
86
}
87
88
int
MapUpdater::schedule_update
(
Map
& map,
uint32
diff)
89
{
90
std::lock_guard<std::mutex> guard(
Lock
);
91
92
++
pending_requests
;
93
Skyfire::Diagnostics::GetRuntimeMetrics
().
RecordMapUpdateScheduled
(
static_cast<
uint32
>
(
pending_requests
));
94
95
if
(
m_executor
.execute(std::unique_ptr<DelayTask>(
new
MapUpdateRequest
(map, *
this
, diff))) == -1)
96
{
97
SF_LOG_ERROR
(
"misc"
,
"Failed to schedule Map Update"
);
98
99
--
pending_requests
;
100
Skyfire::Diagnostics::GetRuntimeMetrics
().
RecordMapUpdateScheduleFailed
(
static_cast<
uint32
>
(
pending_requests
));
101
return
-1;
102
}
103
104
return
0;
105
}
106
107
bool
MapUpdater::activated
()
108
{
109
return
m_executor
.activated();
110
}
111
112
void
MapUpdater::update_finished
()
113
{
114
std::lock_guard<std::mutex> guard(
Lock
);
115
116
if
(
pending_requests
== 0)
117
{
118
SF_LOG_ERROR
(
"misc"
,
"MapUpdater::update_finished BUG, report to devs"
);
119
return
;
120
}
121
122
--
pending_requests
;
123
Skyfire::Diagnostics::GetRuntimeMetrics
().
RecordMapUpdateCompleted
(
static_cast<
uint32
>
(
pending_requests
));
124
125
condition
.notify_all();
126
}
DatabaseEnv.h
uint32
std::uint32_t uint32
Definition
Define.h:77
DelayExecutor.h
Log.h
SF_LOG_ERROR
#define SF_LOG_ERROR(filterType__,...)
Definition
Log.h:143
Map.h
MapUpdater.h
RuntimeMetrics.h
getMSTime
uint32 getMSTime()
Definition
Timer.h:12
getMSTimeDiff
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
Definition
Timer.h:17
Util.h
DelayTask
Definition
DelayExecutor.h:14
Map
Definition
Map.h:238
MapUpdateRequest::m_map
Map & m_map
Definition
MapUpdater.cpp:33
MapUpdateRequest::m_diff
uint32 m_diff
Definition
MapUpdater.cpp:35
MapUpdateRequest::MapUpdateRequest
MapUpdateRequest(Map &m, MapUpdater &u, uint32 d)
Definition
MapUpdater.cpp:38
MapUpdateRequest::call
virtual int call()
Definition
MapUpdater.cpp:41
MapUpdateRequest::m_updater
MapUpdater & m_updater
Definition
MapUpdater.cpp:34
MapUpdater
Definition
MapUpdater.h:18
MapUpdater::schedule_update
int schedule_update(Map &map, uint32 diff)
Definition
MapUpdater.cpp:88
MapUpdater::wait
int wait()
Definition
MapUpdater.cpp:68
MapUpdater::~MapUpdater
virtual ~MapUpdater()
Definition
MapUpdater.cpp:52
MapUpdater::activate
int activate(size_t num_threads)
Definition
MapUpdater.cpp:57
MapUpdater::condition
std::condition_variable condition
Definition
MapUpdater.h:35
MapUpdater::pending_requests
size_t pending_requests
Definition
MapUpdater.h:36
MapUpdater::MapUpdater
MapUpdater()
Definition
MapUpdater.cpp:49
MapUpdater::activated
bool activated()
Definition
MapUpdater.cpp:107
MapUpdater::Lock
std::mutex Lock
Definition
MapUpdater.h:34
MapUpdater::update_finished
void update_finished()
Definition
MapUpdater.cpp:112
MapUpdater::MapUpdateRequest
friend class MapUpdateRequest
Definition
MapUpdater.h:22
MapUpdater::m_executor
DelayExecutor m_executor
Definition
MapUpdater.h:33
MapUpdater::deactivate
int deactivate()
Definition
MapUpdater.cpp:62
Skyfire::Diagnostics::RuntimeMetrics::RecordMapUpdateWait
void RecordMapUpdateWait(uint32 waitMs)
Definition
RuntimeMetrics.cpp:154
Skyfire::Diagnostics::RuntimeMetrics::RecordMapUpdateScheduleFailed
void RecordMapUpdateScheduleFailed(uint32 pendingRequests)
Definition
RuntimeMetrics.cpp:148
Skyfire::Diagnostics::RuntimeMetrics::RecordMapUpdateScheduled
void RecordMapUpdateScheduled(uint32 pendingRequests)
Definition
RuntimeMetrics.cpp:135
Skyfire::Diagnostics::RuntimeMetrics::RecordMapUpdateCompleted
void RecordMapUpdateCompleted(uint32 pendingRequests)
Definition
RuntimeMetrics.cpp:142
WDBThreadEndReq1
Definition
MapUpdater.cpp:23
WDBThreadEndReq1::call
virtual int call()
Definition
MapUpdater.cpp:27
WDBThreadEndReq1::WDBThreadEndReq1
WDBThreadEndReq1()
Definition
MapUpdater.cpp:25
WDBThreadStartReq1
Definition
MapUpdater.cpp:15
WDBThreadStartReq1::WDBThreadStartReq1
WDBThreadStartReq1()
Definition
MapUpdater.cpp:17
WDBThreadStartReq1::call
virtual int call()
Definition
MapUpdater.cpp:19
Skyfire::Diagnostics::GetRuntimeMetrics
RuntimeMetrics & GetRuntimeMetrics()
Definition
RuntimeMetrics.cpp:207
src
server
game
Maps
MapUpdater.cpp
Generated on
for Project SkyFire Core by
1.17.0