FairMQRegion and examples/advanced/Region

This commit is contained in:
Alexey Rybalchenko
2017-06-02 13:50:13 +02:00
committed by Mohammad Al-Turany
parent 65f1b96dc3
commit 221d2567f0
32 changed files with 843 additions and 156 deletions

View File

@@ -29,6 +29,7 @@ FairMQMessageNN::FairMQMessageNN()
: fMessage(nullptr)
, fSize(0)
, fReceiving(false)
, fRegion(false)
{
fMessage = nn_allocmsg(0, 0);
if (!fMessage)
@@ -41,6 +42,7 @@ FairMQMessageNN::FairMQMessageNN(const size_t size)
: fMessage(nullptr)
, fSize(0)
, fReceiving(false)
, fRegion(false)
{
fMessage = nn_allocmsg(size, 0);
if (!fMessage)
@@ -60,6 +62,7 @@ FairMQMessageNN::FairMQMessageNN(void* data, const size_t size, fairmq_free_fn*
: fMessage(nullptr)
, fSize(0)
, fReceiving(false)
, fRegion(false)
{
fMessage = nn_allocmsg(size, 0);
if (!fMessage)
@@ -81,6 +84,15 @@ FairMQMessageNN::FairMQMessageNN(void* data, const size_t size, fairmq_free_fn*
}
}
FairMQMessageNN::FairMQMessageNN(FairMQRegionPtr& region, void* data, const size_t size)
: fMessage(data)
, fSize(size)
, fReceiving(false)
, fRegion(true)
{
// currently nanomsg will copy the buffer (data) inside nn_sendmsg()
}
void FairMQMessageNN::Rebuild()
{
Clear();

View File

@@ -19,6 +19,7 @@
#include <string>
#include "FairMQMessage.h"
#include "FairMQRegion.h"
class FairMQMessageNN : public FairMQMessage
{
@@ -26,6 +27,8 @@ class FairMQMessageNN : public FairMQMessage
FairMQMessageNN();
FairMQMessageNN(const size_t size);
FairMQMessageNN(void* data, const size_t size, fairmq_free_fn* ffn, void* hint = nullptr);
FairMQMessageNN(FairMQRegionPtr& region, void* data, const size_t size);
FairMQMessageNN(const FairMQMessageNN&) = delete;
FairMQMessageNN operator=(const FairMQMessageNN&) = delete;
@@ -53,6 +56,7 @@ class FairMQMessageNN : public FairMQMessage
void* fMessage;
size_t fSize;
bool fReceiving;
bool fRegion;
static std::string fDeviceID;
static FairMQ::Transport fTransportType;

View File

@@ -0,0 +1,34 @@
/********************************************************************************
* Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
* *
* This software is distributed under the terms of the *
* GNU Lesser General Public Licence version 3 (LGPL) version 3, *
* copied verbatim in the file "LICENSE" *
********************************************************************************/
#include "FairMQRegionNN.h"
#include "FairMQLogger.h"
using namespace std;
FairMQRegionNN::FairMQRegionNN(const size_t size)
: fBuffer(malloc(size))
, fSize(size)
{
}
void* FairMQRegionNN::GetData() const
{
return fBuffer;
}
size_t FairMQRegionNN::GetSize() const
{
return fSize;
}
FairMQRegionNN::~FairMQRegionNN()
{
LOG(DEBUG) << "destroying region";
free(fBuffer);
}

View File

@@ -0,0 +1,35 @@
/********************************************************************************
* Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
* *
* This software is distributed under the terms of the *
* GNU Lesser General Public Licence version 3 (LGPL) version 3, *
* copied verbatim in the file "LICENSE" *
********************************************************************************/
#ifndef FAIRMQREGIONNN_H_
#define FAIRMQREGIONNN_H_
#include "FairMQRegion.h"
#include <cstddef> // size_t
class FairMQRegionNN : public FairMQRegion
{
friend class FairMQSocketNN;
public:
FairMQRegionNN(const size_t size);
FairMQRegionNN(const FairMQRegionNN&) = delete;
FairMQRegionNN operator=(const FairMQRegionNN&) = delete;
virtual void* GetData() const override;
virtual size_t GetSize() const override;
virtual ~FairMQRegionNN();
private:
void* fBuffer;
size_t fSize;
};
#endif /* FAIRMQREGIONNN_H_ */

View File

@@ -127,7 +127,14 @@ int FairMQSocketNN::Send(FairMQMessagePtr& msg, const int flags)
while (true)
{
void* ptr = msg->GetMessage();
nbytes = nn_send(fSocket, &ptr, NN_MSG, flags);
if (static_cast<FairMQMessageNN*>(msg.get())->fRegion == false)
{
nbytes = nn_send(fSocket, &ptr, NN_MSG, flags);
}
else
{
nbytes = nn_send(fSocket, ptr, msg->GetSize(), flags);
}
if (nbytes >= 0)
{
fBytesTx += nbytes;

View File

@@ -35,6 +35,11 @@ FairMQMessagePtr FairMQTransportFactoryNN::CreateMessage(void* data, const size_
return unique_ptr<FairMQMessage>(new FairMQMessageNN(data, size, ffn, hint));
}
FairMQMessagePtr FairMQTransportFactoryNN::CreateMessage(FairMQRegionPtr& region, void* data, const size_t size) const
{
return unique_ptr<FairMQMessage>(new FairMQMessageNN(region, data, size));
}
FairMQSocketPtr FairMQTransportFactoryNN::CreateSocket(const string& type, const string& name) const
{
return unique_ptr<FairMQSocket>(new FairMQSocketNN(type, name, GetId()));
@@ -60,6 +65,11 @@ FairMQPollerPtr FairMQTransportFactoryNN::CreatePoller(const FairMQSocket& cmdSo
return unique_ptr<FairMQPoller>(new FairMQPollerNN(cmdSocket, dataSocket));
}
FairMQRegionPtr FairMQTransportFactoryNN::CreateRegion(const size_t size) const
{
return unique_ptr<FairMQRegion>(new FairMQRegionNN(size));
}
FairMQ::Transport FairMQTransportFactoryNN::GetType() const
{
return fTransportType;

View File

@@ -13,6 +13,7 @@
#include "FairMQMessageNN.h"
#include "FairMQSocketNN.h"
#include "FairMQPollerNN.h"
#include "FairMQRegionNN.h"
#include <options/FairMQProgOptions.h>
#include <vector>
@@ -27,6 +28,7 @@ class FairMQTransportFactoryNN : public FairMQTransportFactory
FairMQMessagePtr CreateMessage() const override;
FairMQMessagePtr CreateMessage(const size_t size) const override;
FairMQMessagePtr CreateMessage(void* data, const size_t size, fairmq_free_fn* ffn, void* hint = nullptr) const override;
FairMQMessagePtr CreateMessage(FairMQRegionPtr& region, void* data, const size_t size) const override;
FairMQSocketPtr CreateSocket(const std::string& type, const std::string& name) const override;
@@ -35,6 +37,8 @@ class FairMQTransportFactoryNN : public FairMQTransportFactory
FairMQPollerPtr CreatePoller(const std::unordered_map<std::string, std::vector<FairMQChannel>>& channelsMap, const std::vector<std::string>& channelList) const override;
FairMQPollerPtr CreatePoller(const FairMQSocket& cmdSocket, const FairMQSocket& dataSocket) const override;
FairMQRegionPtr CreateRegion(const size_t size) const override;
FairMQ::Transport GetType() const override;
private: