Jump to content

FBPBM

Members
  • Posts

    1
  • Joined

  • Last visited

    Never
  • Donations

    0.00 GBP 

Posts 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