AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
MapUpdater Class Reference

#include "MapUpdater.h"

Public Member Functions

 MapUpdater ()
 
 ~MapUpdater ()=default
 
void schedule_task (UpdateRequest *request)
 
void schedule_update (Map &map, uint32 diff, uint32 s_diff)
 
void schedule_map_preload (uint32 mapid)
 
void schedule_lfg_update (uint32 diff)
 
void wait ()
 
void activate (std::size_t num_threads)
 
void deactivate ()
 
bool activated ()
 
void update_finished ()
 

Private Member Functions

void WorkerThread ()
 

Private Attributes

ProducerConsumerQueue< UpdateRequest * > _queue
 
std::atomic< int > pending_requests
 
std::atomic< bool > _cancelationToken
 
std::vector< std::thread > _workerThreads
 
std::mutex _lock
 
std::condition_variable _condition
 

Detailed Description

Constructor & Destructor Documentation

◆ MapUpdater()

MapUpdater::MapUpdater ( )
94{
95}
std::atomic< bool > _cancelationToken
Definition MapUpdater.h:50
std::atomic< int > pending_requests
Definition MapUpdater.h:49

◆ ~MapUpdater()

MapUpdater::~MapUpdater ( )
default

Member Function Documentation

◆ activate()

void MapUpdater::activate ( std::size_t  num_threads)
98{
99 _workerThreads.reserve(num_threads);
100 for (std::size_t i = 0; i < num_threads; ++i)
101 {
102 _workerThreads.push_back(std::thread(&MapUpdater::WorkerThread, this));
103 }
104}
std::vector< std::thread > _workerThreads
Definition MapUpdater.h:51
void WorkerThread()
Definition MapUpdater.cpp:172

References _workerThreads, and WorkerThread().

Referenced by MapMgr::Initialize().

◆ activated()

bool MapUpdater::activated ( )
157{
158 return !_workerThreads.empty();
159}

References _workerThreads.

Referenced by MapMgr::UnloadAll(), and MapMgr::Update().

◆ deactivate()

void MapUpdater::deactivate ( )
107{
108 _cancelationToken = true;
109
110 wait(); // This is where we wait for tasks to complete
111
112 _queue.Cancel(); // Cancel the queue to prevent further task processing
113
114 // Join all worker threads
115 for (auto& thread : _workerThreads)
116 {
117 if (thread.joinable())
118 {
119 thread.join();
120 }
121 }
122}
void wait()
Definition MapUpdater.cpp:124
ProducerConsumerQueue< UpdateRequest * > _queue
Definition MapUpdater.h:48
void Cancel()
Definition PCQueue.h:86

References _cancelationToken, _queue, _workerThreads, ProducerConsumerQueue< T >::Cancel(), and wait().

Referenced by MapMgr::UnloadAll().

◆ schedule_lfg_update()

void MapUpdater::schedule_lfg_update ( uint32  diff)
152{
153 schedule_task(new LFGUpdateRequest(*this, diff));
154}
Definition MapUpdater.cpp:79
void schedule_task(UpdateRequest *request)
Definition MapUpdater.cpp:134

References schedule_task().

Referenced by MapMgr::Update().

◆ schedule_map_preload()

void MapUpdater::schedule_map_preload ( uint32  mapid)
147{
148 schedule_task(new MapPreloadRequest(mapid, *this));
149}
Definition MapUpdater.cpp:58

References schedule_task().

◆ schedule_task()

void MapUpdater::schedule_task ( UpdateRequest request)
135{
136 // Atomic increment for pending_requests
137 pending_requests.fetch_add(1, std::memory_order_release);
138 _queue.Push(request);
139}
void Push(const T &value)
Definition PCQueue.h:39

References _queue, pending_requests, and ProducerConsumerQueue< T >::Push().

Referenced by schedule_lfg_update(), schedule_map_preload(), and schedule_update().

◆ schedule_update()

void MapUpdater::schedule_update ( Map map,
uint32  diff,
uint32  s_diff 
)
142{
143 schedule_task(new MapUpdateRequest(map, *this, diff, s_diff));
144}
Definition MapUpdater.cpp:36

References schedule_task().

Referenced by MapMgr::Update().

◆ update_finished()

void MapUpdater::update_finished ( )
162{
163 // Atomic decrement for pending_requests
164 if (pending_requests.fetch_sub(1, std::memory_order_acquire) == 1)
165 {
166 // Only notify when pending_requests becomes 0 (i.e., all tasks are finished)
167 std::lock_guard<std::mutex> lock(_lock); // Lock only for condition variable notification
168 _condition.notify_all(); // Notify waiting threads that all requests are complete
169 }
170}
std::mutex _lock
Definition MapUpdater.h:52
std::condition_variable _condition
Definition MapUpdater.h:53

References _condition, _lock, and pending_requests.

Referenced by MapUpdateRequest::call(), MapPreloadRequest::call(), and LFGUpdateRequest::call().

◆ wait()

void MapUpdater::wait ( )
125{
126 std::unique_lock<std::mutex> guard(_lock); // Guard lock for safe waiting
127
128 // Wait until there are no pending requests
129 _condition.wait(guard, [this] {
130 return pending_requests.load(std::memory_order_acquire) == 0;
131 });
132}

References _condition, _lock, and pending_requests.

Referenced by deactivate(), and MapMgr::Update().

◆ WorkerThread()

void MapUpdater::WorkerThread ( )
private
173{
174 LoginDatabase.WarnAboutSyncQueries(true);
175 CharacterDatabase.WarnAboutSyncQueries(true);
176 WorldDatabase.WarnAboutSyncQueries(true);
177
178 while (!_cancelationToken)
179 {
180 UpdateRequest* request = nullptr;
181
182 _queue.WaitAndPop(request); // Wait for and pop a request from the queue
183
184 if (!_cancelationToken && request)
185 {
186 request->call(); // Execute the request
187 delete request; // Clean up after processing
188 }
189 }
190}
DatabaseWorkerPool< LoginDatabaseConnection > LoginDatabase
Accessor to the realm/login database.
Definition DatabaseEnv.cpp:22
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition DatabaseEnv.cpp:20
void WaitAndPop(T &value)
Definition PCQueue.h:71
Definition MapUpdater.cpp:27
virtual void call()=0

References _cancelationToken, _queue, UpdateRequest::call(), CharacterDatabase, LoginDatabase, ProducerConsumerQueue< T >::WaitAndPop(), and WorldDatabase.

Referenced by activate().

Member Data Documentation

◆ _cancelationToken

std::atomic<bool> MapUpdater::_cancelationToken
private

Referenced by deactivate(), and WorkerThread().

◆ _condition

std::condition_variable MapUpdater::_condition
private

Referenced by update_finished(), and wait().

◆ _lock

std::mutex MapUpdater::_lock
private

Referenced by update_finished(), and wait().

◆ _queue

ProducerConsumerQueue<UpdateRequest*> MapUpdater::_queue
private

◆ _workerThreads

std::vector<std::thread> MapUpdater::_workerThreads
private

Referenced by activate(), activated(), and deactivate().

◆ pending_requests

std::atomic<int> MapUpdater::pending_requests
private

The documentation for this class was generated from the following files: