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_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 ( )
71{
72}
std::atomic< bool > _cancelationToken
Definition MapUpdater.h:49
std::atomic< int > pending_requests
Definition MapUpdater.h:48

◆ ~MapUpdater()

MapUpdater::~MapUpdater ( )
default

Member Function Documentation

◆ activate()

void MapUpdater::activate ( std::size_t  num_threads)
75{
76 _workerThreads.reserve(num_threads);
77 for (std::size_t i = 0; i < num_threads; ++i)
78 {
79 _workerThreads.push_back(std::thread(&MapUpdater::WorkerThread, this));
80 }
81}
std::vector< std::thread > _workerThreads
Definition MapUpdater.h:50
void WorkerThread()
Definition MapUpdater.cpp:144

References _workerThreads, and WorkerThread().

Referenced by MapMgr::Initialize().

◆ activated()

bool MapUpdater::activated ( )
129{
130 return !_workerThreads.empty();
131}

References _workerThreads.

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

◆ deactivate()

void MapUpdater::deactivate ( )
84{
85 _cancelationToken = true;
86
87 wait(); // This is where we wait for tasks to complete
88
89 _queue.Cancel(); // Cancel the queue to prevent further task processing
90
91 // Join all worker threads
92 for (auto& thread : _workerThreads)
93 {
94 if (thread.joinable())
95 {
96 thread.join();
97 }
98 }
99}
void wait()
Definition MapUpdater.cpp:101
ProducerConsumerQueue< UpdateRequest * > _queue
Definition MapUpdater.h:47
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)
124{
125 schedule_task(new LFGUpdateRequest(*this, diff));
126}
Definition MapUpdater.cpp:56
void schedule_task(UpdateRequest *request)
Definition MapUpdater.cpp:111

References schedule_task().

Referenced by MapMgr::Update().

◆ schedule_task()

void MapUpdater::schedule_task ( UpdateRequest request)
112{
113 // Atomic increment for pending_requests
114 pending_requests.fetch_add(1, std::memory_order_release);
115 _queue.Push(request);
116}
void Push(const T &value)
Definition PCQueue.h:39

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

Referenced by schedule_lfg_update(), and schedule_update().

◆ schedule_update()

void MapUpdater::schedule_update ( Map map,
uint32  diff,
uint32  s_diff 
)
119{
120 schedule_task(new MapUpdateRequest(map, *this, diff, s_diff));
121}
Definition MapUpdater.cpp:34

References schedule_task().

Referenced by MapMgr::Update().

◆ update_finished()

void MapUpdater::update_finished ( )
134{
135 // Atomic decrement for pending_requests
136 if (pending_requests.fetch_sub(1, std::memory_order_acquire) == 1)
137 {
138 // Only notify when pending_requests becomes 0 (i.e., all tasks are finished)
139 std::lock_guard<std::mutex> lock(_lock); // Lock only for condition variable notification
140 _condition.notify_all(); // Notify waiting threads that all requests are complete
141 }
142}
std::mutex _lock
Definition MapUpdater.h:51
std::condition_variable _condition
Definition MapUpdater.h:52

References _condition, _lock, and pending_requests.

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

◆ wait()

void MapUpdater::wait ( )
102{
103 std::unique_lock<std::mutex> guard(_lock); // Guard lock for safe waiting
104
105 // Wait until there are no pending requests
106 _condition.wait(guard, [this] {
107 return pending_requests.load(std::memory_order_acquire) == 0;
108 });
109}

References _condition, _lock, and pending_requests.

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

◆ WorkerThread()

void MapUpdater::WorkerThread ( )
private
145{
146 LoginDatabase.WarnAboutSyncQueries(true);
147 CharacterDatabase.WarnAboutSyncQueries(true);
148 WorldDatabase.WarnAboutSyncQueries(true);
149
150 while (!_cancelationToken)
151 {
152 UpdateRequest* request = nullptr;
153
154 _queue.WaitAndPop(request); // Wait for and pop a request from the queue
155
156 if (!_cancelationToken && request)
157 {
158 request->call(); // Execute the request
159 delete request; // Clean up after processing
160 }
161 }
162}
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:25
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: