diff --git a/luprex/core/cpp/idalloc.cpp b/luprex/core/cpp/idalloc.cpp index 1a91b33d..39fca25e 100644 --- a/luprex/core/cpp/idalloc.cpp +++ b/luprex/core/cpp/idalloc.cpp @@ -83,6 +83,27 @@ int64_t IdGlobalPool::alloc_id_for_thread(lua_State *L) { } } +void IdGlobalPool::serialize(StreamBuffer *sb) { + sb->write_int64(salvaged_.size()); + for (int64_t batch : salvaged_) { + sb->write_int64(batch); + } + sb->write_int64(next_batch_); + sb->write_int64(next_id_); + sb->write_int64(queue_fill_); +} + +void IdGlobalPool::deserialize(StreamBuffer *sb) { + int64_t salvaged_size = sb->read_int64(); + salvaged_.resize(salvaged_size); + for (int i=0; i < salvaged_size; i++) { + salvaged_[i] = sb->read_int64(); + } + next_batch_ = sb->read_int64(); + next_id_ = sb->read_int64(); + queue_fill_ = sb->read_int64(); +} + IdPlayerPool::IdPlayerPool(IdGlobalPool *gp) { global_ = gp; } @@ -133,6 +154,21 @@ void IdPlayerPool::prepare_thread(lua_State *L) { lua_setnextid(L, get_batch()); } +void IdPlayerPool::serialize(StreamBuffer *sb) { + sb->write_int64(ranges_.size()); + for (int64_t batch : ranges_) { + sb->write_int64(batch); + } +} + +void IdPlayerPool::deserialize(StreamBuffer *sb) { + int64_t ranges_size = sb->read_int64(); + ranges_.resize(ranges_size); + for (int i=0; i < ranges_size; i++) { + ranges_[i] = sb->read_int64(); + } +} + LuaDefine(unittests_idalloc, "c") { IdGlobalPool gp; IdPlayerPool pp(&gp); diff --git a/luprex/core/cpp/idalloc.hpp b/luprex/core/cpp/idalloc.hpp index e12aee04..55225d27 100644 --- a/luprex/core/cpp/idalloc.hpp +++ b/luprex/core/cpp/idalloc.hpp @@ -69,6 +69,7 @@ #include #include #include "luastack.hpp" +#include "streambuffer.hpp" class IdGlobalPool { private: @@ -118,6 +119,12 @@ public: // Allocate an ID for the specified thread. Uses the thread's // batch if possible. If not, fetches one ID from the global pool. int64_t alloc_id_for_thread(lua_State *L); + + // Serialize to a streambuffer. + void serialize(StreamBuffer *sb); + + // Deserialize from a streambuffer. + void deserialize(StreamBuffer *sb); }; class IdPlayerPool { @@ -155,6 +162,12 @@ public: // Return the size of the queue. int size() { return ranges_.size(); } + + // Serialize to a streambuffer. + void serialize(StreamBuffer *sb); + + // Deserialize from a streambuffer. + void deserialize(StreamBuffer *sb); }; #endif // IDALLOC_HPP