mirror of
https://github.com/FairRootGroup/FairMQ.git
synced 2025-10-15 17:41:45 +00:00
First version of the shared memory transport.
Use via `--transport shmem` cmd option. No pub/sub.
This commit is contained in:
@@ -22,8 +22,10 @@
|
||||
|
||||
using namespace std;
|
||||
|
||||
string FairMQMessageNN::fDeviceID = string();
|
||||
|
||||
FairMQMessageNN::FairMQMessageNN()
|
||||
: fMessage(NULL)
|
||||
: fMessage(nullptr)
|
||||
, fSize(0)
|
||||
, fReceiving(false)
|
||||
{
|
||||
@@ -35,7 +37,7 @@ FairMQMessageNN::FairMQMessageNN()
|
||||
}
|
||||
|
||||
FairMQMessageNN::FairMQMessageNN(const size_t size)
|
||||
: fMessage(NULL)
|
||||
: fMessage(nullptr)
|
||||
, fSize(0)
|
||||
, fReceiving(false)
|
||||
{
|
||||
@@ -54,7 +56,7 @@ FairMQMessageNN::FairMQMessageNN(const size_t size)
|
||||
* possible TODO: make this zero copy (will should then be as efficient as ZeroMQ).
|
||||
*/
|
||||
FairMQMessageNN::FairMQMessageNN(void* data, const size_t size, fairmq_free_fn* ffn, void* hint)
|
||||
: fMessage(NULL)
|
||||
: fMessage(nullptr)
|
||||
, fSize(0)
|
||||
, fReceiving(false)
|
||||
{
|
||||
@@ -71,6 +73,10 @@ FairMQMessageNN::FairMQMessageNN(void* data, const size_t size, fairmq_free_fn*
|
||||
{
|
||||
ffn(data, hint);
|
||||
}
|
||||
else
|
||||
{
|
||||
free(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,30 +140,9 @@ void FairMQMessageNN::SetMessage(void* data, const size_t size)
|
||||
fSize = size;
|
||||
}
|
||||
|
||||
void FairMQMessageNN::Copy(FairMQMessage* msg)
|
||||
void FairMQMessageNN::SetDeviceId(const string& deviceId)
|
||||
{
|
||||
// DEPRECATED: Use Copy(const unique_ptr<FairMQMessage>&)
|
||||
|
||||
if (fMessage)
|
||||
{
|
||||
if (nn_freemsg(fMessage) < 0)
|
||||
{
|
||||
LOG(ERROR) << "failed freeing message, reason: " << nn_strerror(errno);
|
||||
}
|
||||
}
|
||||
|
||||
size_t size = msg->GetSize();
|
||||
|
||||
fMessage = nn_allocmsg(size, 0);
|
||||
if (!fMessage)
|
||||
{
|
||||
LOG(ERROR) << "failed allocating message, reason: " << nn_strerror(errno);
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(fMessage, msg->GetMessage(), size);
|
||||
fSize = size;
|
||||
}
|
||||
fDeviceID = deviceId;
|
||||
}
|
||||
|
||||
void FairMQMessageNN::Copy(const unique_ptr<FairMQMessage>& msg)
|
||||
@@ -192,7 +177,7 @@ inline void FairMQMessageNN::Clear()
|
||||
}
|
||||
else
|
||||
{
|
||||
fMessage = NULL;
|
||||
fMessage = nullptr;
|
||||
fSize = 0;
|
||||
}
|
||||
}
|
||||
@@ -208,7 +193,7 @@ FairMQMessageNN::~FairMQMessageNN()
|
||||
}
|
||||
else
|
||||
{
|
||||
fMessage = NULL;
|
||||
fMessage = nullptr;
|
||||
fSize = 0;
|
||||
}
|
||||
}
|
||||
|
@@ -16,6 +16,7 @@
|
||||
#define FAIRMQMESSAGENN_H_
|
||||
|
||||
#include <cstddef>
|
||||
#include <string>
|
||||
|
||||
#include "FairMQMessage.h"
|
||||
|
||||
@@ -24,13 +25,13 @@ class FairMQMessageNN : public FairMQMessage
|
||||
public:
|
||||
FairMQMessageNN();
|
||||
FairMQMessageNN(const size_t size);
|
||||
FairMQMessageNN(void* data, const size_t size, fairmq_free_fn* ffn, void* hint = NULL);
|
||||
FairMQMessageNN(void* data, const size_t size, fairmq_free_fn* ffn, void* hint = nullptr);
|
||||
FairMQMessageNN(const FairMQMessageNN&) = delete;
|
||||
FairMQMessageNN operator=(const FairMQMessageNN&) = delete;
|
||||
|
||||
virtual void Rebuild();
|
||||
virtual void Rebuild(const size_t size);
|
||||
virtual void Rebuild(void* data, const size_t size, fairmq_free_fn* ffn, void* hint = NULL);
|
||||
virtual void Rebuild(void* data, const size_t size, fairmq_free_fn* ffn, void* hint = nullptr);
|
||||
|
||||
virtual void* GetMessage();
|
||||
virtual void* GetData();
|
||||
@@ -38,8 +39,8 @@ class FairMQMessageNN : public FairMQMessage
|
||||
|
||||
virtual void SetMessage(void* data, const size_t size);
|
||||
|
||||
virtual void CloseMessage() {};
|
||||
virtual void Copy(FairMQMessage* msg);
|
||||
virtual void SetDeviceId(const std::string& deviceId);
|
||||
|
||||
virtual void Copy(const std::unique_ptr<FairMQMessage>& msg);
|
||||
|
||||
virtual ~FairMQMessageNN();
|
||||
@@ -50,6 +51,7 @@ class FairMQMessageNN : public FairMQMessage
|
||||
void* fMessage;
|
||||
size_t fSize;
|
||||
bool fReceiving;
|
||||
static std::string fDeviceID;
|
||||
|
||||
void Clear();
|
||||
};
|
||||
|
@@ -110,26 +110,7 @@ void FairMQSocketNN::Connect(const string& address)
|
||||
|
||||
int FairMQSocketNN::Send(FairMQMessage* msg, const string& flag)
|
||||
{
|
||||
void* ptr = msg->GetMessage();
|
||||
int nbytes = nn_send(fSocket, &ptr, NN_MSG, GetConstant(flag));
|
||||
if (nbytes >= 0)
|
||||
{
|
||||
fBytesTx += nbytes;
|
||||
++fMessagesTx;
|
||||
static_cast<FairMQMessageNN*>(msg)->fReceiving = false;
|
||||
return nbytes;
|
||||
}
|
||||
if (nn_errno() == EAGAIN)
|
||||
{
|
||||
return -2;
|
||||
}
|
||||
if (nn_errno() == ETERM)
|
||||
{
|
||||
LOG(INFO) << "terminating socket " << fId;
|
||||
return -1;
|
||||
}
|
||||
LOG(ERROR) << "Failed sending on socket " << fId << ", reason: " << nn_strerror(errno);
|
||||
return nbytes;
|
||||
return Send(msg, GetConstant(flag));
|
||||
}
|
||||
|
||||
int FairMQSocketNN::Send(FairMQMessage* msg, const int flags)
|
||||
@@ -198,28 +179,7 @@ int64_t FairMQSocketNN::Send(const vector<unique_ptr<FairMQMessage>>& msgVec, co
|
||||
|
||||
int FairMQSocketNN::Receive(FairMQMessage* msg, const string& flag)
|
||||
{
|
||||
void* ptr = NULL;
|
||||
int nbytes = nn_recv(fSocket, &ptr, NN_MSG, GetConstant(flag));
|
||||
if (nbytes >= 0)
|
||||
{
|
||||
fBytesRx += nbytes;
|
||||
++fMessagesRx;
|
||||
msg->Rebuild();
|
||||
msg->SetMessage(ptr, nbytes);
|
||||
static_cast<FairMQMessageNN*>(msg)->fReceiving = true;
|
||||
return nbytes;
|
||||
}
|
||||
if (nn_errno() == EAGAIN)
|
||||
{
|
||||
return -2;
|
||||
}
|
||||
if (nn_errno() == ETERM)
|
||||
{
|
||||
LOG(INFO) << "terminating socket " << fId;
|
||||
return -1;
|
||||
}
|
||||
LOG(ERROR) << "Failed receiving on socket " << fId << ", reason: " << nn_strerror(errno);
|
||||
return nbytes;
|
||||
return Receive(msg, GetConstant(flag));
|
||||
}
|
||||
|
||||
int FairMQSocketNN::Receive(FairMQMessage* msg, const int flags)
|
||||
@@ -318,6 +278,14 @@ void FairMQSocketNN::Terminate()
|
||||
nn_term();
|
||||
}
|
||||
|
||||
void FairMQSocketNN::Interrupt()
|
||||
{
|
||||
}
|
||||
|
||||
void FairMQSocketNN::Resume()
|
||||
{
|
||||
}
|
||||
|
||||
void* FairMQSocketNN::GetSocket() const
|
||||
{
|
||||
return NULL; // dummy method to comply with the interface. functionality not possible in zeromq.
|
||||
@@ -330,6 +298,21 @@ int FairMQSocketNN::GetSocket(int /*nothing*/) const
|
||||
|
||||
void FairMQSocketNN::SetOption(const string& option, const void* value, size_t valueSize)
|
||||
{
|
||||
if (option == "snd-size" || option == "rcv-size")
|
||||
{
|
||||
int val = *(static_cast<int*>(const_cast<void*>(value)));
|
||||
if (val <= 0)
|
||||
{
|
||||
LOG(WARN) << "nanomsg: value for sndKernelSize/rcvKernelSize should be greater than 0, using defaults (128kB).";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (option == "snd-hwm" || option == "rcv-hwm")
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int rc = nn_setsockopt(fSocket, NN_SOL_SOCKET, GetConstant(option), value, valueSize);
|
||||
if (rc < 0)
|
||||
{
|
||||
|
@@ -45,6 +45,9 @@ class FairMQSocketNN : public FairMQSocket
|
||||
virtual void Close();
|
||||
virtual void Terminate();
|
||||
|
||||
virtual void Interrupt();
|
||||
virtual void Resume();
|
||||
|
||||
virtual void SetOption(const std::string& option, const void* value, size_t valueSize);
|
||||
virtual void GetOption(const std::string& option, void* value, size_t* valueSize);
|
||||
|
||||
|
Reference in New Issue
Block a user