FairMQ  1.3.8
C++ Message Passing Framework
FairMQSink.h
1 /********************************************************************************
2  * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
3  * *
4  * This software is distributed under the terms of the *
5  * GNU Lesser General Public Licence (LGPL) version 3, *
6  * copied verbatim in the file "LICENSE" *
7  ********************************************************************************/
15 #ifndef FAIRMQSINK_H_
16 #define FAIRMQSINK_H_
17 
18 #include <string>
19 #include <chrono>
20 
21 #include "../FairMQDevice.h"
22 #include "../FairMQLogger.h"
23 #include "../options/FairMQProgOptions.h"
24 
25 // template<typename OutputPolicy>
26 class FairMQSink : public FairMQDevice//, public OutputPolicy
27 {
28  public:
29  FairMQSink()
30  : fMultipart(false)
31  , fMaxIterations(0)
32  , fNumIterations(0)
33  , fInChannelName()
34  {}
35 
36  virtual ~FairMQSink()
37  {}
38 
39  protected:
40  bool fMultipart;
41  uint64_t fMaxIterations;
42  uint64_t fNumIterations;
43  std::string fInChannelName;
44 
45  virtual void InitTask()
46  {
47  fMultipart = fConfig->GetValue<bool>("multipart");
48  fMaxIterations = fConfig->GetValue<uint64_t>("max-iterations");
49  fInChannelName = fConfig->GetValue<std::string>("in-channel");
50  }
51 
52  virtual void Run()
53  {
54  // store the channel reference to avoid traversing the map on every loop iteration
55  FairMQChannel& dataInChannel = fChannels.at(fInChannelName).at(0);
56 
57  LOG(info) << "Starting the benchmark and expecting to receive " << fMaxIterations << " messages.";
58  auto tStart = std::chrono::high_resolution_clock::now();
59 
60  while (CheckCurrentState(RUNNING))
61  {
62  if (fMultipart)
63  {
64  FairMQParts parts;
65 
66  if (dataInChannel.Receive(parts) >= 0)
67  {
68  if (fMaxIterations > 0)
69  {
70  if (fNumIterations >= fMaxIterations)
71  {
72  LOG(info) << "Configured maximum number of iterations reached.";
73  break;
74  }
75  }
76  fNumIterations++;
77  }
78  }
79  else
80  {
81  FairMQMessagePtr msg(dataInChannel.NewMessage());
82 
83  if (dataInChannel.Receive(msg) >= 0)
84  {
85  if (fMaxIterations > 0)
86  {
87  if (fNumIterations >= fMaxIterations)
88  {
89  LOG(info) << "Configured maximum number of iterations reached.";
90  break;
91  }
92  }
93  fNumIterations++;
94  }
95  }
96  }
97 
98  auto tEnd = std::chrono::high_resolution_clock::now();
99 
100  LOG(info) << "Leaving RUNNING state. Received " << fNumIterations << " messages in " << std::chrono::duration<double, std::milli>(tEnd - tStart).count() << "ms.";
101  }
102 };
103 
104 #endif /* FAIRMQSINK_H_ */
virtual void InitTask()
Task initialization (can be overloaded in child classes)
Definition: FairMQSink.h:45
int Receive(FairMQMessagePtr &msg, int rcvTimeoutInMs=-1)
Definition: FairMQChannel.h:244
FairMQProgOptions * fConfig
Pointer to config (internal or external)
Definition: FairMQDevice.h:413
Definition: FairMQChannel.h:27
Definition: FairMQSink.h:26
std::unordered_map< std::string, std::vector< FairMQChannel > > fChannels
Device channels.
Definition: FairMQDevice.h:411
FairMQParts is a lightweight convenience wrapper around a vector of unique pointers to FairMQMessage...
Definition: FairMQParts.h:20
Definition: FairMQDevice.h:46
virtual void Run()
Runs the device (to be overloaded in child classes)
Definition: FairMQSink.h:52

privacy