diff --git a/fairmq/shmem/Manager.h b/fairmq/shmem/Manager.h index 5ace4c0f..9a41f332 100644 --- a/fairmq/shmem/Manager.h +++ b/fairmq/shmem/Manager.h @@ -88,6 +88,11 @@ struct ShmHeader return HdrPtr(ptr)->refCount; } + static uint16_t UserOffset(char* ptr) + { + return HdrPartSize() + HdrPtr(ptr)->userOffset; + } + static char* UserPtr(char* ptr) { // [HdrOffset(uint16_t)][Hdr alignment][Hdr][user buffer alignment][user buffer] diff --git a/fairmq/shmem/Message.h b/fairmq/shmem/Message.h index 0e674e00..50d349bb 100644 --- a/fairmq/shmem/Message.h +++ b/fairmq/shmem/Message.h @@ -217,7 +217,9 @@ class Message final : public fair::mq::Message } else if (newSize <= fMeta.fSize) { try { try { - char* ptr = fManager.ShrinkInPlace(newSize, fManager.GetAddressFromHandle(fMeta.fHandle, fMeta.fSegmentId), fMeta.fSegmentId); + char* oldPtr = fManager.GetAddressFromHandle(fMeta.fHandle, fMeta.fSegmentId); + uint16_t userOffset = ShmHeader::UserOffset(oldPtr); + char* ptr = fManager.ShrinkInPlace(userOffset + newSize, oldPtr, fMeta.fSegmentId); fLocalPtr = ShmHeader::UserPtr(ptr); fMeta.fSize = newSize; return true;