Jump to content

FBPBM

Members
  • Posts

    1
  • Joined

  • Last visited

    Never
  • Donations

    0.00 GBP 

Everything posted by FBPBM

  1. Problems to compile with Linix , with Windows no Problem ... any Sugestíons Why ? #include "MapUpdater.h" #include "DelayExecutor.h" #include "Map.h" #include "Database/DatabaseEnv.h" #include <ace/Guard_T.h> #include <ace/Method_Request.h> //the reason this things are here is that i want to make //the netcode patch and the multithreaded maps independant //once they are merged 1 class should be used class WDBThreadStartReq1 : public ACE_Method_Request { public: WDBThreadStartReq1 () { } virtual int call (void) { WorldDatabase.ThreadStart (); return 0; } }; class WDBThreadEndReq1 : public ACE_Method_Request { public: WDBThreadEndReq1 () { } virtual int call (void) { WorldDatabase.ThreadEnd (); return 0; } }; class MapUpdateRequest : public ACE_Method_Request { public: Map& m_map; MapUpdater& m_updater; ACE_UINT32 m_diff; MapUpdateRequest (Map& m, MapUpdater& u, ACE_UINT32 d) : m_map(m), m_updater(u), m_diff(d) { } virtual int call (void) { m_map.Update (m_diff); m_updater.update_finished (); return 0; } }; MapUpdater::MapUpdater () : m_mutex (), m_condition (m_mutex), m_executor (), pending_requests (0) { return; } MapUpdater::~MapUpdater () { this->deactivate (); } int MapUpdater::activate (size_t num_threads) { return this->m_executor.activate (static_cast<int> (num_threads), new WDBThreadStartReq1, new WDBThreadEndReq1); } int MapUpdater::Deactivate (void) { this->wait (); return this->m_executor.deactivate (); } int MapUpdater::wait () { ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, this->m_mutex,-1); while(this->pending_requests > 0) this->m_condition.wait (); return 0; } int MapUpdater::schedule_update(Map& map, ACE_UINT32 diff) { ACE_GUARD_RETURN(ACE_Thread_Mutex, guard, this->m_mutex,-1); ++this->pending_requests; if( this->m_executor.execute (new MapUpdateRequest(map, *this, diff)) == -1) { ACE_DEBUG ((LM_ERROR, ACE_TEXT ("(%t) \\n"), ACE_TEXT ("Failed to schedule Map Update"))); --this->pending_requests; return -1; } return 0; } bool MapUpdater::activated () { return m_executor.activated(); } void MapUpdater::update_finished () { ACE_GUARD (ACE_Thread_Mutex, guard, this->m_mutex); if (this->pending_requests == 0) { ACE_ERROR ((LM_ERROR, ACE_TEXT ("(%t)\\n"), ACE_TEXT ("MapUpdater::update_finished BUG, report to devs"))); return; } --this->pending_requests; //TODO can more than one thread call wait (), it shouldnt happen //however I ensure if in future more than 1 thread call it by //using broadcast instead of signal () this->m_condition.broadcast (); }
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Privacy Policy Terms of Use