Added cWorld:QueueSaveAllChunks() function for saving chunks asynchronously.
The cWorld:SaveAllChunks() is therefore deprecated in the API and will be removed soon, use QueueSaveAllChunks() instead.
This commit is contained in:
parent
ac9224da91
commit
829cc866cd
@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Lua binding: AllToLua
|
||||
** Generated automatically by tolua++-1.0.92 on 08/11/13 19:12:37.
|
||||
** Generated automatically by tolua++-1.0.92 on 08/11/13 20:59:51.
|
||||
*/
|
||||
|
||||
#ifndef __cplusplus
|
||||
@ -13434,6 +13434,37 @@ static int tolua_AllToLua_cWorld_SaveAllChunks00(lua_State* tolua_S)
|
||||
}
|
||||
#endif //#ifndef TOLUA_DISABLE
|
||||
|
||||
/* method: QueueSaveAllChunks of class cWorld */
|
||||
#ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_QueueSaveAllChunks00
|
||||
static int tolua_AllToLua_cWorld_QueueSaveAllChunks00(lua_State* tolua_S)
|
||||
{
|
||||
#ifndef TOLUA_RELEASE
|
||||
tolua_Error tolua_err;
|
||||
if (
|
||||
!tolua_isusertype(tolua_S,1,"cWorld",0,&tolua_err) ||
|
||||
!tolua_isnoobj(tolua_S,2,&tolua_err)
|
||||
)
|
||||
goto tolua_lerror;
|
||||
else
|
||||
#endif
|
||||
{
|
||||
cWorld* self = (cWorld*) tolua_tousertype(tolua_S,1,0);
|
||||
#ifndef TOLUA_RELEASE
|
||||
if (!self) tolua_error(tolua_S,"invalid 'self' in function 'QueueSaveAllChunks'", NULL);
|
||||
#endif
|
||||
{
|
||||
self->QueueSaveAllChunks();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
#ifndef TOLUA_RELEASE
|
||||
tolua_lerror:
|
||||
tolua_error(tolua_S,"#ferror in function 'QueueSaveAllChunks'.",&tolua_err);
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
#endif //#ifndef TOLUA_DISABLE
|
||||
|
||||
/* method: GetNumChunks of class cWorld */
|
||||
#ifndef TOLUA_DISABLE_tolua_AllToLua_cWorld_GetNumChunks00
|
||||
static int tolua_AllToLua_cWorld_GetNumChunks00(lua_State* tolua_S)
|
||||
@ -29878,6 +29909,7 @@ TOLUA_API int tolua_AllToLua_open (lua_State* tolua_S)
|
||||
tolua_function(tolua_S,"GetBiomeAt",tolua_AllToLua_cWorld_GetBiomeAt00);
|
||||
tolua_function(tolua_S,"GetName",tolua_AllToLua_cWorld_GetName00);
|
||||
tolua_function(tolua_S,"SaveAllChunks",tolua_AllToLua_cWorld_SaveAllChunks00);
|
||||
tolua_function(tolua_S,"QueueSaveAllChunks",tolua_AllToLua_cWorld_QueueSaveAllChunks00);
|
||||
tolua_function(tolua_S,"GetNumChunks",tolua_AllToLua_cWorld_GetNumChunks00);
|
||||
tolua_function(tolua_S,"GetGeneratorQueueLength",tolua_AllToLua_cWorld_GetGeneratorQueueLength00);
|
||||
tolua_function(tolua_S,"GetLightingQueueLength",tolua_AllToLua_cWorld_GetLightingQueueLength00);
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Lua binding: AllToLua
|
||||
** Generated automatically by tolua++-1.0.92 on 08/11/13 19:12:37.
|
||||
** Generated automatically by tolua++-1.0.92 on 08/11/13 20:59:52.
|
||||
*/
|
||||
|
||||
/* Exported function */
|
||||
|
@ -1,3 +1,4 @@
|
||||
|
||||
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
|
||||
|
||||
#include "BlockID.h"
|
||||
@ -242,7 +243,7 @@ cWorld::cWorld(const AString & a_WorldName) :
|
||||
m_WeatherInterval(24000), // Guaranteed 1 day of sunshine at server start :)
|
||||
m_TickThread(*this)
|
||||
{
|
||||
LOGD("cWorld::cWorld(%s)", a_WorldName.c_str());
|
||||
LOGD("cWorld::cWorld(\"%s\")", a_WorldName.c_str());
|
||||
|
||||
cMakeDir::MakeDir(m_WorldName.c_str());
|
||||
}
|
||||
@ -587,6 +588,7 @@ void cWorld::Tick(float a_Dt)
|
||||
m_ChunkMap->Tick(a_Dt);
|
||||
|
||||
TickQueuedBlocks(a_Dt);
|
||||
TickQueuedTasks();
|
||||
|
||||
GetSimulatorManager()->Simulate(a_Dt);
|
||||
|
||||
@ -781,6 +783,27 @@ void cWorld::TickSpawnMobs(float a_Dt)
|
||||
|
||||
|
||||
|
||||
void cWorld::TickQueuedTasks(void)
|
||||
{
|
||||
// Make a copy of the tasks to avoid deadlocks on accessing m_Tasks
|
||||
cTasks Tasks;
|
||||
{
|
||||
cCSLock Lock(m_CSTasks);
|
||||
std::swap(Tasks, m_Tasks);
|
||||
}
|
||||
|
||||
// Execute and delete each task:
|
||||
for (cTasks::iterator itr = m_Tasks.begin(), end = m_Tasks.end(); itr != end; ++itr)
|
||||
{
|
||||
(*itr)->Run(*this);
|
||||
delete *itr;
|
||||
} // for itr - m_Tasks[]
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cWorld::WakeUpSimulators(int a_BlockX, int a_BlockY, int a_BlockZ)
|
||||
{
|
||||
return m_ChunkMap->WakeUpSimulators(a_BlockX, a_BlockY, a_BlockZ);
|
||||
@ -2307,6 +2330,25 @@ void cWorld::SaveAllChunks(void)
|
||||
|
||||
|
||||
|
||||
void cWorld::QueueSaveAllChunks(void)
|
||||
{
|
||||
QueueTask(new cWorld::cTaskSaveAllChunks);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cWorld::QueueTask(cTask * a_Task)
|
||||
{
|
||||
cCSLock Lock(m_CSTasks);
|
||||
m_Tasks.push_back(a_Task);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cWorld::AddEntity(cEntity * a_Entity)
|
||||
{
|
||||
m_ChunkMap->AddEntity(a_Entity);
|
||||
@ -2552,3 +2594,15 @@ cFluidSimulator * cWorld::InitializeFluidSimulator(cIniFile & a_IniFile, const c
|
||||
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// cWorld::cTaskSaveAllChunks:
|
||||
|
||||
void cWorld::cTaskSaveAllChunks::Run(cWorld & a_World)
|
||||
{
|
||||
a_World.SaveAllChunks();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -70,6 +70,24 @@ public:
|
||||
cLock(cWorld & a_World);
|
||||
} ;
|
||||
|
||||
/// A common ancestor for all tasks queued onto the tick thread
|
||||
class cTask
|
||||
{
|
||||
public:
|
||||
virtual void Run(cWorld & a_World) = 0;
|
||||
} ;
|
||||
|
||||
typedef std::vector<cTask *> cTasks;
|
||||
|
||||
class cTaskSaveAllChunks :
|
||||
public cTask
|
||||
{
|
||||
protected:
|
||||
// cTask overrides:
|
||||
virtual void Run(cWorld & a_World) override;
|
||||
} ;
|
||||
|
||||
|
||||
// tolua_begin
|
||||
|
||||
static const char * GetClassStatic(void)
|
||||
@ -461,8 +479,15 @@ public:
|
||||
if(a_Z < 0 && a_Z % cChunkDef::Width != 0) a_ChunkZ--;
|
||||
}
|
||||
|
||||
/// Saves all chunks immediately. Dangerous interface, may deadlock, use QueueSaveAllChunks() instead
|
||||
void SaveAllChunks(void); // tolua_export
|
||||
|
||||
/// Queues a task to save all chunks onto the tick thread. The prefferred way of saving chunks from external sources
|
||||
void QueueSaveAllChunks(void); // tolua_export
|
||||
|
||||
/// Queues a task onto the tick thread. The task object will be deleted once the task is finished
|
||||
void QueueTask(cTask * a_Task);
|
||||
|
||||
/// Returns the number of chunks loaded
|
||||
int GetNumChunks() const; // tolua_export
|
||||
|
||||
@ -630,6 +655,12 @@ private:
|
||||
cLightingThread m_Lighting;
|
||||
cTickThread m_TickThread;
|
||||
|
||||
/// Guards the m_Tasks
|
||||
cCriticalSection m_CSTasks;
|
||||
|
||||
/// Tasks that have been queued onto the tick thread; guarded by m_CSTasks
|
||||
cTasks m_Tasks;
|
||||
|
||||
|
||||
cWorld(const AString & a_WorldName);
|
||||
~cWorld();
|
||||
@ -639,6 +670,9 @@ private:
|
||||
void TickWeather(float a_Dt); // Handles weather each tick
|
||||
void TickSpawnMobs(float a_Dt); // Handles mob spawning each tick
|
||||
|
||||
/// Executes all tasks queued onto the tick thread
|
||||
void TickQueuedTasks(void);
|
||||
|
||||
/// Creates a new fluid simulator, loads its settings from the inifile (a_FluidName section)
|
||||
cFluidSimulator * InitializeFluidSimulator(cIniFile & a_IniFile, const char * a_FluidName, BLOCKTYPE a_SimulateBlock, BLOCKTYPE a_StationaryBlock);
|
||||
}; // tolua_export
|
||||
|
Loading…
Reference in New Issue
Block a user