Jump to content

MapUpdater - Need compilehelp for Linux Core


Guest FBPBM

Recommended Posts

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 ();
}

Link to comment
Share on other sites

×
×
  • 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