artdaq_core  v1_05_07
 All Classes Namespaces Functions
SimpleQueueReader.cc
1 #include "artdaq-core/Core/SimpleQueueReader.hh"
2 
3 #include <chrono> // for milliseconds
4 #include <cstddef> // for std::size_t
5 #include <iostream>
6 #include <string>
7 #include <thread> // for sleep_for
8 
9 namespace artdaq {
10 
11  int simpleQueueReaderApp(int argc, char **argv)
12  {
13  try {
14  size_t eec(0);
15  if (argc == 2) {
16  std::istringstream ins(argv[1]);
17  ins >> eec;
18  }
19  SimpleQueueReader reader(eec);
20  reader.run();
21  return 0;
22  }
23  catch (std::string const & msg) {
24  std::cerr << "simpleQueueReaderApp failed: "
25  << msg;
26  return 1;
27  }
28  catch (...) {
29  return 1;
30  }
31  }
32 
33  SimpleQueueReader::
34  SimpleQueueReader(std::size_t eec) :
35  queue_(getGlobalQueue()),
36  expectedEventCount_(eec)
37  { }
38 
39  void SimpleQueueReader::run()
40  {
41  std::size_t eventsSeen = 0;
42  char * doPrint = getenv("VERBOSE_QUEUE_READING");
43  while (true) {
44  RawEvent_ptr rawEventPtr;
45  if (queue_.deqNowait(rawEventPtr)) {
46  // If we got a null pointer, we're done...
47  if (!rawEventPtr) { break; }
48  ++eventsSeen;
49  // Otherwise, do our work ...
50  if (doPrint) { std::cout << *rawEventPtr << std::endl; }
51  }
52  else {
53  std::this_thread::sleep_for(std::chrono::milliseconds(250));
54  }
55  }
56  if (expectedEventCount_ && eventsSeen != expectedEventCount_)
57  {
58  std::ostringstream os;
59  os << "Wrong number of events in SimpleQueueReader ("
60  << eventsSeen << " != " << expectedEventCount_ << ").\n";
61  throw os.str();
62  }
63  }
64 }