mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-12 16:21:13 +00:00
Message::SetUsedSize: add optional alignment argument, to avoid storing alignment with the msg object
This commit is contained in:
parent
1b7532a520
commit
3c714fd9e0
|
@ -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; }
|
||||
|
|
|
@ -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<size_t>(oldPtr)), 12);
|
||||
}
|
||||
char* ptr = fManager.Allocate(newSize, alignment.alignment);
|
||||
char* userPtr = ShmHeader::UserPtr(ptr);
|
||||
std::memcpy(userPtr, fLocalPtr, newSize);
|
||||
fManager.Deallocate(fHandle, fSegmentId);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user