diff options
author | rubidium <rubidium@openttd.org> | 2009-05-17 20:38:05 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2009-05-17 20:38:05 +0000 |
commit | 10406e8ad668e230eaeac4a969dca367da1d9bd8 (patch) | |
tree | 7a4b64aeaf764e69e1360db47b1d42bd5db3c0a7 | |
parent | 543cc6b75eac3dc8864c21ed65707e1affa2e78f (diff) | |
download | openttd-10406e8ad668e230eaeac4a969dca367da1d9bd8.tar.xz |
(svn r16346) -Codechange: don't exploit the pool system in the way done for the saveload pool; it makes writing replacements unnecessarily difficult. And now we've got SmallVector that does more than enough for saving with less lines of 'interface' code.
-rw-r--r-- | src/saveload/saveload.cpp | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index c0b6561c2..9389bdab2 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -1266,34 +1266,34 @@ struct ThreadedSave { CursorID cursor; }; -/* A maximum size of of 128K * 500 = 64.000KB savegames */ -STATIC_OLD_POOL(Savegame, byte, 17, 500, NULL, NULL) +/** Save in chunks of 128 KiB. */ +static const int MEMORY_CHUNK_SIZE = 128 * 1024; +/** Memory allocation for storing savegames in memory. */ +static AutoFreeSmallVector<byte *, 16> _memory_savegame; + static ThreadedSave _ts; -static bool InitMem() +static void WriteMem(size_t size) { - _ts.count = 0; - - _Savegame_pool.CleanPool(); - _Savegame_pool.AddBlockToPool(); + _ts.count += (uint)size; - /* A block from the pool is a contigious area of memory, so it is safe to write to it sequentially */ - _sl.bufsize = GetSavegamePoolSize(); - _sl.buf = GetSavegame(_ts.count); - return true; + _sl.buf = CallocT<byte>(MEMORY_CHUNK_SIZE); + *_memory_savegame.Append() = _sl.buf; } static void UnInitMem() { - _Savegame_pool.CleanPool(); + _memory_savegame.Clear(); } -static void WriteMem(size_t size) +static bool InitMem() { - _ts.count += (uint)size; - /* Allocate new block and new buffer-pointer */ - _Savegame_pool.AddBlockIfNeeded(_ts.count); - _sl.buf = GetSavegame(_ts.count); + _ts.count = 0; + _sl.bufsize = MEMORY_CHUNK_SIZE; + + UnInitMem(); + WriteMem(0); + return true; } /******************************************** @@ -1675,7 +1675,7 @@ static void SaveFileError() SaveFileDone(); } -/** We have written the whole game into memory, _Savegame_pool, now find +/** We have written the whole game into memory, _memory_savegame, now find * and appropiate compressor and start writing to file. */ static SaveOrLoadResult SaveFileToDisk(bool threaded) @@ -1696,18 +1696,17 @@ static SaveOrLoadResult SaveFileToDisk(bool threaded) { uint i; - uint count = 1 << Savegame_POOL_BLOCK_SIZE_BITS; if (_ts.count != _sl.offs_base) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Unexpected size of chunk"); - for (i = 0; i != _Savegame_pool.GetBlockCount() - 1; i++) { - _sl.buf = _Savegame_pool.blocks[i]; - fmt->writer(count); + for (i = 0; i != _memory_savegame.Length() - 1; i++) { + _sl.buf = _memory_savegame[i]; + fmt->writer(MEMORY_CHUNK_SIZE); } /* The last block is (almost) always not fully filled, so only write away * as much data as it is in there */ - _sl.buf = _Savegame_pool.blocks[i]; - fmt->writer(_ts.count - (i * count)); + _sl.buf = _memory_savegame[i]; + fmt->writer(_ts.count % MEMORY_CHUNK_SIZE); } fmt->uninit_write(); |