mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-16 01:51:45 +00:00
Extend the FairMQ transport interface by allowing the user of the FairMQMessage class to define his own deallocation function.
This function will be called when the transport machanism no longer needs the data. Use this extension with the Protobuf data format, to enable more efficient transport, avoiding memcpy.
This commit is contained in:
@@ -37,7 +37,7 @@ FairMQMessageNN::FairMQMessageNN(size_t size)
|
||||
fReceiving = false;
|
||||
}
|
||||
|
||||
FairMQMessageNN::FairMQMessageNN(void* data, size_t size)
|
||||
FairMQMessageNN::FairMQMessageNN(void* data, size_t size, fairmq_free_fn *ffn, void* hint)
|
||||
{
|
||||
fMessage = nn_allocmsg(size, 0);
|
||||
if (!fMessage)
|
||||
@@ -47,6 +47,15 @@ FairMQMessageNN::FairMQMessageNN(void* data, size_t size)
|
||||
memcpy(fMessage, data, size);
|
||||
fSize = size;
|
||||
fReceiving = false;
|
||||
|
||||
if(ffn)
|
||||
{
|
||||
ffn(data, hint);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(data) free(data);
|
||||
}
|
||||
}
|
||||
|
||||
void FairMQMessageNN::Rebuild()
|
||||
@@ -69,7 +78,7 @@ void FairMQMessageNN::Rebuild(size_t size)
|
||||
fReceiving = false;
|
||||
}
|
||||
|
||||
void FairMQMessageNN::Rebuild(void* data, size_t size)
|
||||
void FairMQMessageNN::Rebuild(void* data, size_t size, fairmq_free_fn *ffn, void* hint)
|
||||
{
|
||||
Clear();
|
||||
fMessage = nn_allocmsg(size, 0);
|
||||
@@ -80,6 +89,15 @@ void FairMQMessageNN::Rebuild(void* data, size_t size)
|
||||
memcpy(fMessage, data, size);
|
||||
fSize = size;
|
||||
fReceiving = false;
|
||||
|
||||
if(ffn)
|
||||
{
|
||||
ffn(data, hint);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(data) free(data);
|
||||
}
|
||||
}
|
||||
|
||||
void* FairMQMessageNN::GetMessage()
|
||||
|
@@ -24,11 +24,11 @@ class FairMQMessageNN : public FairMQMessage
|
||||
public:
|
||||
FairMQMessageNN();
|
||||
FairMQMessageNN(size_t size);
|
||||
FairMQMessageNN(void* data, size_t size);
|
||||
FairMQMessageNN(void* data, size_t size, fairmq_free_fn *ffn = NULL, void* hint = NULL);
|
||||
|
||||
virtual void Rebuild();
|
||||
virtual void Rebuild(size_t size);
|
||||
virtual void Rebuild(void* data, size_t site);
|
||||
virtual void Rebuild(void* data, size_t size, fairmq_free_fn *ffn = NULL, void* hint = NULL);
|
||||
|
||||
virtual void* GetMessage();
|
||||
virtual void* GetData();
|
||||
|
@@ -29,9 +29,9 @@ FairMQMessage* FairMQTransportFactoryNN::CreateMessage(size_t size)
|
||||
return new FairMQMessageNN(size);
|
||||
}
|
||||
|
||||
FairMQMessage* FairMQTransportFactoryNN::CreateMessage(void* data, size_t size)
|
||||
FairMQMessage* FairMQTransportFactoryNN::CreateMessage(void* data, size_t size, fairmq_free_fn *ffn, void* hint)
|
||||
{
|
||||
return new FairMQMessageNN(data, size);
|
||||
return new FairMQMessageNN(data, size, ffn, hint);
|
||||
}
|
||||
|
||||
FairMQSocket* FairMQTransportFactoryNN::CreateSocket(const string& type, int num, int numIoThreads)
|
||||
|
@@ -29,7 +29,7 @@ class FairMQTransportFactoryNN : public FairMQTransportFactory
|
||||
|
||||
virtual FairMQMessage* CreateMessage();
|
||||
virtual FairMQMessage* CreateMessage(size_t size);
|
||||
virtual FairMQMessage* CreateMessage(void* data, size_t size);
|
||||
virtual FairMQMessage* CreateMessage(void* data, size_t size, fairmq_free_fn *ffn = NULL, void* hint = NULL);
|
||||
virtual FairMQSocket* CreateSocket(const string& type, int num, int numIoThreads);
|
||||
virtual FairMQPoller* CreatePoller(const vector<FairMQSocket*>& inputs);
|
||||
|
||||
|
Reference in New Issue
Block a user