- Add multipart support to the interface and enable its use out of tasks.

Examples on the use out of tasks are provided in:
  `example/Tutorial3/digitization/TestDetectorDigiLoader.tpl:76-85`: sending a part.
  `example/Tutorial3/reconstruction/FairTestDetectorMQRecoTask.tpl:177-182`: receiving a part.

- This commit also makes structure within processorTask more consistent with samplerTask.

- add macro MQLOG to FairMQLogger.
This commit is contained in:
Alexey Rybalchenko 2014-07-25 12:07:47 +02:00
parent 281fcc459c
commit 8cd120aef4
9 changed files with 71 additions and 25 deletions

View File

@ -52,8 +52,11 @@ std::ostringstream& FairMQLogger::Log(int type)
case ERROR:
type_str = "\033[01;31mERROR\033[0m";
break;
case WARN:
type_str = "\033[01;33mWARN\033[0m";
break;
case STATE:
type_str = "\033[01;33mSTATE\033[0m";
type_str = "\033[01;35mSTATE\033[0m";
default:
break;
}

View File

@ -31,6 +31,7 @@ class FairMQLogger
DEBUG,
INFO,
ERROR,
WARN,
STATE
};
FairMQLogger();
@ -46,5 +47,6 @@ typedef unsigned long long timestamp_t;
timestamp_t get_timestamp();
#define LOG(type) FairMQLogger().Log(FairMQLogger::type)
#define MQLOG(type) FairMQLogger().Log(FairMQLogger::type)
#endif /* FAIRMQLOGGER_H_ */

View File

@ -29,14 +29,15 @@ class FairMQSocket
virtual void Bind(const string& address) = 0;
virtual void Connect(const string& address) = 0;
virtual size_t Send(FairMQMessage* msg) = 0;
virtual size_t Receive(FairMQMessage* msg) = 0;
virtual size_t Send(FairMQMessage* msg, const string& flag="") = 0;
virtual size_t Receive(FairMQMessage* msg, const string& flag="") = 0;
virtual void* GetSocket() = 0;
virtual int GetSocket(int nothing) = 0;
virtual void Close() = 0;
virtual void SetOption(const string& option, const void* value, size_t valueSize) = 0;
virtual void GetOption(const string& option, void* value, size_t* valueSize) = 0;
virtual unsigned long GetBytesTx() = 0;
virtual unsigned long GetBytesRx() = 0;

View File

@ -177,7 +177,7 @@ namespace FairMQFSM
// Transition table for FairMQFMS
struct transition_table : mpl::vector<
// Start Event Next Action Guard
// +---------+---------+-------+---------+--------+
// +------------------+----------+------------------+-------------+---------+
msmf::Row<IDLE_FSM, INIT, INITIALIZING_FSM, InitFct, msmf::none>,
msmf::Row<IDLE_FSM, END, msmf::none, TestFct, msmf::none>, // this is an invalid transition...
msmf::Row<INITIALIZING_FSM, SETOUTPUT, SETTINGOUTPUT_FSM, SetOutputFct, msmf::none>,

View File

@ -37,6 +37,12 @@ FairMQMessageNN::FairMQMessageNN(size_t size)
fReceiving = false;
}
/* nanomsg does not offer support for creating a message out of an existing buffer,
* therefore the following method is using memcpy. For more efficient handling,
* create FairMQMessage object only with size parameter and fill it with data.
* possible TODO: make this zero copy (will should then be as efficient as ZeroMQ).
*/
FairMQMessageNN::FairMQMessageNN(void* data, size_t size, fairmq_free_fn *ffn, void* hint)
{
fMessage = nn_allocmsg(size, 0);

View File

@ -69,7 +69,7 @@ void FairMQSocketNN::Connect(const string& address)
}
}
size_t FairMQSocketNN::Send(FairMQMessage* msg)
size_t FairMQSocketNN::Send(FairMQMessage* msg, const string& flag)
{
void* ptr = msg->GetMessage();
int rc = nn_send(fSocket, &ptr, NN_MSG, 0);
@ -87,7 +87,7 @@ size_t FairMQSocketNN::Send(FairMQMessage* msg)
return rc;
}
size_t FairMQSocketNN::Receive(FairMQMessage* msg)
size_t FairMQSocketNN::Receive(FairMQMessage* msg, const string& flag)
{
void* ptr = NULL;
int rc = nn_recv(fSocket, &ptr, NN_MSG, 0);
@ -130,6 +130,14 @@ void FairMQSocketNN::SetOption(const string& option, const void* value, size_t v
}
}
void FairMQSocketNN::GetOption(const string& option, void* value, size_t* valueSize)
{
int rc = nn_getsockopt(fSocket, NN_SOL_SOCKET, GetConstant(option), value, valueSize);
if (rc < 0) {
LOG(ERROR) << "failed getting socket option, reason: " << nn_strerror(errno);
}
}
unsigned long FairMQSocketNN::GetBytesTx()
{
return fBytesTx;
@ -152,6 +160,8 @@ unsigned long FairMQSocketNN::GetMessagesRx()
int FairMQSocketNN::GetConstant(const string& constant)
{
if (constant == "")
return 0;
if (constant == "sub")
return NN_SUB;
if (constant == "pub")
@ -168,6 +178,14 @@ int FairMQSocketNN::GetConstant(const string& constant)
return NN_SNDBUF;
if (constant == "rcv-hwm")
return NN_RCVBUF;
if (constant == "snd-more") {
LOG(ERROR) << "Multipart messages functionality currently not supported by nanomsg!";
return -1;
}
if (constant == "rcv-more") {
LOG(ERROR) << "Multipart messages functionality currently not supported by nanomsg!";
return -1;
}
return -1;
}

View File

@ -31,14 +31,15 @@ class FairMQSocketNN : public FairMQSocket
virtual void Bind(const string& address);
virtual void Connect(const string& address);
virtual size_t Send(FairMQMessage* msg);
virtual size_t Receive(FairMQMessage* msg);
virtual size_t Send(FairMQMessage* msg, const string& flag="");
virtual size_t Receive(FairMQMessage* msg, const string& flag="");
virtual void* GetSocket();
virtual int GetSocket(int nothing);
virtual void Close();
virtual void SetOption(const string& option, const void* value, size_t valueSize);
virtual void GetOption(const string& option, void* value, size_t* valueSize);
unsigned long GetBytesTx();
unsigned long GetBytesRx();

View File

@ -82,9 +82,9 @@ void FairMQSocketZMQ::Connect(const string& address)
}
}
size_t FairMQSocketZMQ::Send(FairMQMessage* msg)
size_t FairMQSocketZMQ::Send(FairMQMessage* msg, const string& flag)
{
int nbytes = zmq_msg_send(static_cast<zmq_msg_t*>(msg->GetMessage()), fSocket, 0);
int nbytes = zmq_msg_send(static_cast<zmq_msg_t*>(msg->GetMessage()), fSocket, GetConstant(flag));
if (nbytes >= 0)
{
fBytesTx += nbytes;
@ -99,9 +99,9 @@ size_t FairMQSocketZMQ::Send(FairMQMessage* msg)
return nbytes;
}
size_t FairMQSocketZMQ::Receive(FairMQMessage* msg)
size_t FairMQSocketZMQ::Receive(FairMQMessage* msg, const string& flag)
{
int nbytes = zmq_msg_recv(static_cast<zmq_msg_t*>(msg->GetMessage()), fSocket, 0);
int nbytes = zmq_msg_recv(static_cast<zmq_msg_t*>(msg->GetMessage()), fSocket, GetConstant(flag));
if (nbytes >= 0)
{
fBytesRx += nbytes;
@ -152,6 +152,14 @@ void FairMQSocketZMQ::SetOption(const string& option, const void* value, size_t
}
}
void FairMQSocketZMQ::GetOption(const string& option, void* value, size_t* valueSize)
{
int rc = zmq_getsockopt(fSocket, GetConstant(option), value, valueSize);
if (rc < 0) {
LOG(ERROR) << "failed getting socket option, reason: " << zmq_strerror(errno);
}
}
unsigned long FairMQSocketZMQ::GetBytesTx()
{
return fBytesTx;
@ -174,6 +182,8 @@ unsigned long FairMQSocketZMQ::GetMessagesRx()
int FairMQSocketZMQ::GetConstant(const string& constant)
{
if (constant == "")
return 0;
if (constant == "sub")
return ZMQ_SUB;
if (constant == "pub")
@ -190,6 +200,10 @@ int FairMQSocketZMQ::GetConstant(const string& constant)
return ZMQ_SNDHWM;
if (constant == "rcv-hwm")
return ZMQ_RCVHWM;
if (constant == "snd-more")
return ZMQ_SNDMORE;
if (constant == "rcv-more")
return ZMQ_RCVMORE;
return -1;
}

View File

@ -32,14 +32,15 @@ class FairMQSocketZMQ : public FairMQSocket
virtual void Bind(const string& address);
virtual void Connect(const string& address);
virtual size_t Send(FairMQMessage* msg);
virtual size_t Receive(FairMQMessage* msg);
virtual size_t Send(FairMQMessage* msg, const string& flag="");
virtual size_t Receive(FairMQMessage* msg, const string& flag="");
virtual void* GetSocket();
virtual int GetSocket(int nothing);
virtual void Close();
virtual void SetOption(const string& option, const void* value, size_t valueSize);
virtual void GetOption(const string& option, void* value, size_t* valueSize);
virtual unsigned long GetBytesTx();
virtual unsigned long GetBytesRx();