diff options
author | XTZGZoReX <none@none> | 2010-06-06 22:55:56 +0200 |
---|---|---|
committer | XTZGZoReX <none@none> | 2010-06-06 22:55:56 +0200 |
commit | 62200e8d022479ff057b6898380e1dd8374d2ec2 (patch) | |
tree | 57aba1e545b7e839e154819bcb937c97ecfd4417 /src/server/game/Maps/MapUpdater.cpp | |
parent | 840d4ab99d270088a225af69562920fdc3043556 (diff) |
* Even more restructuring of the game library.
--HG--
branch : trunk
Diffstat (limited to 'src/server/game/Maps/MapUpdater.cpp')
-rw-r--r-- | src/server/game/Maps/MapUpdater.cpp | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/server/game/Maps/MapUpdater.cpp b/src/server/game/Maps/MapUpdater.cpp new file mode 100644 index 00000000000..f9bb5e2bbbc --- /dev/null +++ b/src/server/game/Maps/MapUpdater.cpp @@ -0,0 +1,129 @@ +#include "MapUpdater.h" +#include "DelayExecutor.h" +#include "Map.h" +#include "Database/DatabaseEnv.h" + +#include <ace/Guard_T.h> +#include <ace/Method_Request.h> + +class WDBThreadStartReq1 : public ACE_Method_Request +{ + public: + + WDBThreadStartReq1() + { + } + + virtual int call() + { + WorldDatabase.ThreadStart(); + return 0; + } +}; + +class WDBThreadEndReq1 : public ACE_Method_Request +{ + public: + + WDBThreadEndReq1() + { + } + + virtual int call() + { + WorldDatabase.ThreadEnd(); + return 0; + } +}; + +class MapUpdateRequest : public ACE_Method_Request +{ + private: + + Map& m_map; + MapUpdater& m_updater; + ACE_UINT32 m_diff; + + public: + + MapUpdateRequest(Map& m, MapUpdater& u, ACE_UINT32 d) + : m_map(m), m_updater(u), m_diff(d) + { + } + + virtual int call() + { + m_map.Update (m_diff); + m_updater.update_finished (); + return 0; + } +}; + +MapUpdater::MapUpdater() + : m_mutex(), m_condition(m_mutex), m_executor(), pending_requests(0) +{ +} + +MapUpdater::~MapUpdater() +{ + deactivate(); +} + +int MapUpdater::activate(size_t num_threads) +{ + return m_executor.activate((int)num_threads, new WDBThreadStartReq1, new WDBThreadEndReq1); +} + +int MapUpdater::deactivate() +{ + wait(); + + return m_executor.deactivate(); +} + +int MapUpdater::wait() +{ + ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, m_mutex, -1); + + while (pending_requests > 0) + m_condition.wait(); + + return 0; +} + +int MapUpdater::schedule_update(Map& map, ACE_UINT32 diff) +{ + ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, m_mutex, -1); + + ++pending_requests; + + if (m_executor.execute(new MapUpdateRequest(map, *this, diff)) == -1) + { + ACE_DEBUG((LM_ERROR, ACE_TEXT("(%t) \n"), ACE_TEXT("Failed to schedule Map Update"))); + + --pending_requests; + return -1; + } + + return 0; +} + +bool MapUpdater::activated() +{ + return m_executor.activated(); +} + +void MapUpdater::update_finished() +{ + ACE_GUARD(ACE_Thread_Mutex, guard, m_mutex); + + if (pending_requests == 0) + { + ACE_ERROR((LM_ERROR, ACE_TEXT("(%t)\n"), ACE_TEXT("MapUpdater::update_finished BUG, report to devs"))); + return; + } + + --pending_requests; + + m_condition.broadcast(); +} |