From 83572bb84ead27ac3caa7cbcaa325fecaf6d0244 Mon Sep 17 00:00:00 2001 From: Gyuhwan Park Date: Thu, 6 Oct 2022 20:44:45 +0900 Subject: hotfix(IPCConnection): fix std::bad_alloc: use memmove() instead of releasing std::unique_ptr --- IPCConnection.cpp | 2 +- IPCConnection.hpp | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/IPCConnection.cpp b/IPCConnection.cpp index a4bcd40..d74cd44 100644 --- a/IPCConnection.cpp +++ b/IPCConnection.cpp @@ -137,7 +137,7 @@ void IPCConnection::workerLoop() { readPos += retval; if (readPos >= contentLength) { - promise.set_value(std::move(readBuffer)); + promise->set_value(std::move(readBuffer)); { std::scoped_lock scopedReadTasksLock(_readTasksLock); _readTasks.pop(); diff --git a/IPCConnection.hpp b/IPCConnection.hpp index 1338853..82ad068 100644 --- a/IPCConnection.hpp +++ b/IPCConnection.hpp @@ -50,17 +50,20 @@ public: std::unique_ptr read(size_t size) { assert(size != 0); - auto promise = std::promise>(); + auto promise = std::make_shared>>(); { std::scoped_lock scopedReadTasksLock(_readTasksLock); _readTasks.emplace(size, promise); } - auto pointer = promise.get_future().get(); - - return std::move(std::unique_ptr( - reinterpret_cast(pointer.release()), + auto source = promise->get_future().get(); + auto destination = std::unique_ptr( + (T *) malloc(size), free - )); + ); + + std::memmove(destination.get(), source.get(), size); + + return std::move(destination); } void write(const void *pointer, size_t size); @@ -79,7 +82,7 @@ private: std::mutex _readTasksLock; std::queue>> _writeTasks; - std::queue> &>> _readTasks; + std::queue>> >> _readTasks; }; -- cgit v1.2.3