From 4f17362aeb80e5339c58a5d3b0fbaeb88d9e701c Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Mon, 13 Feb 2012 21:47:03 +0000 Subject: Rewritten most of the code for multithreading; still not 100%, but getting there. If this commit proves to be too problematic, we can always undo it. git-svn-id: http://mc-server.googlecode.com/svn/trunk@251 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/WorldStorage.h | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 source/WorldStorage.h (limited to 'source/WorldStorage.h') diff --git a/source/WorldStorage.h b/source/WorldStorage.h new file mode 100644 index 000000000..52573caf0 --- /dev/null +++ b/source/WorldStorage.h @@ -0,0 +1,94 @@ + +// WorldStorage.h + +// Interfaces to the cWorldStorage class representing the chunk loading / saving thread +// This class decides which storage schema to use for saving; it queries all available schemas for loading +// Also declares the base class for all storage schemas, cWSSchema + + + + + +#pragma once +#ifndef WORLDSTORAGE_H_INCLUDED +#define WORLDSTORAGE_H_INCLUDED + +#include "cChunk.h" +#include "cIsThread.h" + + + + + +/// Interface that all the world storage schemas need to implement +class cWSSchema ABSTRACT +{ +public: + cWSSchema(cWorld * a_World) : m_World(a_World) {} + virtual ~cWSSchema() {} // Force the descendants' destructors to be virtual + + virtual bool LoadChunk(const cChunkPtr & a_Chunk) = 0; + virtual bool SaveChunk(const cChunkPtr & a_Chunk) = 0; + virtual const AString GetName(void) const = 0; + +protected: + + cWorld * m_World; +} ; + +typedef std::list cWSSchemaList; + + + + + +class cWorldStorage : + public cIsThread +{ + typedef cIsThread super; + +public: + + cWorldStorage(void); + ~cWorldStorage(); + + void QueueLoadChunk(cChunkPtr & a_Chunk); // Queues the chunk for loading; if not loaded, the chunk will be generated + void QueueSaveChunk(cChunkPtr & a_Chunk); + + void UnqueueLoad(const cChunkPtr & a_Chunk); + void UnqueueSave(const cChunkPtr & a_Chunk); + + bool Start(cWorld * a_World, const AString & a_StorageSchemaName); // Hide the cIsThread's Start() method, we need to provide args + void WaitForFinish(void); + +protected: + + cWorld * m_World; + AString m_StorageSchemaName; + + cCriticalSection m_CSLoadQueue; + cChunkPtrList m_LoadQueue; + + cCriticalSection m_CSSaveQueue; + cChunkPtrList m_SaveQueue; + + cEvent m_Event; // Set when there's any addition to the queues + + cWSSchemaList m_Schemas; + cWSSchema * m_SaveSchema; + + void InitSchemas(void); + + virtual void Execute(void) override; + bool LoadChunk(const cChunkPtr & a_Chunk); +} ; + + + + + +#endif // WORLDSTORAGE_H_INCLUDED + + + + -- cgit v1.2.3