From 3c714fd9e0ae153ca0fadde8fdbc551aca61a623 Mon Sep 17 00:00:00 2001 From: Alexey Rybalchenko Date: Wed, 18 Oct 2023 13:01:28 +0200 Subject: [PATCH] Message::SetUsedSize: add optional alignment argument, to avoid storing alignment with the msg object --- fairmq/Message.h | 2 +- fairmq/shmem/Message.h | 10 +++++++--- fairmq/zeromq/Message.h | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/fairmq/Message.h b/fairmq/Message.h index 9b57318a..f065085e 100644 --- a/fairmq/Message.h +++ b/fairmq/Message.h @@ -46,7 +46,7 @@ struct Message virtual void* GetData() const = 0; virtual size_t GetSize() const = 0; - virtual bool SetUsedSize(size_t size) = 0; + virtual bool SetUsedSize(size_t size, Alignment alignment = Alignment{0}) = 0; virtual Transport GetType() const = 0; TransportFactory* GetTransport() { return fTransport; } diff --git a/fairmq/shmem/Message.h b/fairmq/shmem/Message.h index 502034e9..eedd8700 100644 --- a/fairmq/shmem/Message.h +++ b/fairmq/shmem/Message.h @@ -257,7 +257,7 @@ class Message final : public fair::mq::Message size_t GetSize() const override { return fSize; } - bool SetUsedSize(size_t newSize) override + bool SetUsedSize(size_t newSize, Alignment alignment = Alignment{0}) override { if (newSize == fSize) { return true; @@ -266,8 +266,8 @@ class Message final : public fair::mq::Message return true; } else if (newSize <= fSize) { try { + char* oldPtr = fManager.GetAddressFromHandle(fHandle, fSegmentId); try { - char* oldPtr = fManager.GetAddressFromHandle(fHandle, fSegmentId); uint16_t userOffset = ShmHeader::UserOffset(oldPtr); char* ptr = fManager.ShrinkInPlace(userOffset + newSize, oldPtr, fSegmentId); fLocalPtr = ShmHeader::UserPtr(ptr); @@ -278,7 +278,11 @@ class Message final : public fair::mq::Message // unused size >= 1000000 bytes: reallocate fully // unused size < 1000000 bytes: simply reset the size and keep the rest of the buffer until message destruction if (fSize - newSize >= 1000000) { - char* ptr = fManager.Allocate(newSize, fAlignment); + if (alignment.alignment == 0) { + // if no alignment is provided, take the minimum alignment of the old pointer, but no more than 4096 + alignment.alignment = 1 << std::min(__builtin_ctz(reinterpret_cast(oldPtr)), 12); + } + char* ptr = fManager.Allocate(newSize, alignment.alignment); char* userPtr = ShmHeader::UserPtr(ptr); std::memcpy(userPtr, fLocalPtr, newSize); fManager.Deallocate(fHandle, fSegmentId); diff --git a/fairmq/zeromq/Message.h b/fairmq/zeromq/Message.h index 9624229c..a00bfb0c 100644 --- a/fairmq/zeromq/Message.h +++ b/fairmq/zeromq/Message.h @@ -210,7 +210,7 @@ class Message final : public fair::mq::Message // destroyed. Used size is applied only once in ApplyUsedSize, which is called by the socket // before sending. This function just updates the desired size until the actual "resizing" // happens. - bool SetUsedSize(size_t size) override + bool SetUsedSize(size_t size, Alignment /* alignment */ = Alignment{0}) override { if (size == GetSize()) { // nothing to do