mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-13 16:46:47 +00:00
Message::SetUsedSize: add optional alignment argument, to avoid storing alignment with the msg object
This commit is contained in:
parent
db49205b82
commit
f2caaaba6f
|
@ -46,7 +46,7 @@ struct Message
|
||||||
virtual void* GetData() const = 0;
|
virtual void* GetData() const = 0;
|
||||||
virtual size_t GetSize() 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;
|
virtual Transport GetType() const = 0;
|
||||||
TransportFactory* GetTransport() { return fTransport; }
|
TransportFactory* GetTransport() { return fTransport; }
|
||||||
|
|
|
@ -257,7 +257,7 @@ class Message final : public fair::mq::Message
|
||||||
|
|
||||||
size_t GetSize() const override { return fSize; }
|
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) {
|
if (newSize == fSize) {
|
||||||
return true;
|
return true;
|
||||||
|
@ -266,8 +266,8 @@ class Message final : public fair::mq::Message
|
||||||
return true;
|
return true;
|
||||||
} else if (newSize <= fSize) {
|
} else if (newSize <= fSize) {
|
||||||
try {
|
try {
|
||||||
|
char* oldPtr = fManager.GetAddressFromHandle(fHandle, fSegmentId);
|
||||||
try {
|
try {
|
||||||
char* oldPtr = fManager.GetAddressFromHandle(fHandle, fSegmentId);
|
|
||||||
uint16_t userOffset = ShmHeader::UserOffset(oldPtr);
|
uint16_t userOffset = ShmHeader::UserOffset(oldPtr);
|
||||||
char* ptr = fManager.ShrinkInPlace(userOffset + newSize, oldPtr, fSegmentId);
|
char* ptr = fManager.ShrinkInPlace(userOffset + newSize, oldPtr, fSegmentId);
|
||||||
fLocalPtr = ShmHeader::UserPtr(ptr);
|
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: reallocate fully
|
||||||
// unused size < 1000000 bytes: simply reset the size and keep the rest of the buffer until message destruction
|
// unused size < 1000000 bytes: simply reset the size and keep the rest of the buffer until message destruction
|
||||||
if (fSize - newSize >= 1000000) {
|
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);
|
char* userPtr = ShmHeader::UserPtr(ptr);
|
||||||
std::memcpy(userPtr, fLocalPtr, newSize);
|
std::memcpy(userPtr, fLocalPtr, newSize);
|
||||||
fManager.Deallocate(fHandle, fSegmentId);
|
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
|
// 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"
|
// before sending. This function just updates the desired size until the actual "resizing"
|
||||||
// happens.
|
// happens.
|
||||||
bool SetUsedSize(size_t size) override
|
bool SetUsedSize(size_t size, Alignment /* alignment */ = Alignment{0}) override
|
||||||
{
|
{
|
||||||
if (size == GetSize()) {
|
if (size == GetSize()) {
|
||||||
// nothing to do
|
// nothing to do
|
||||||
|
|
Loading…
Reference in New Issue
Block a user