Project
Loading...
Searching...
No Matches
Fifo.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12//-*- Mode: C++ -*-
13
14#ifndef FIFO_H
15#define FIFO_H
16//****************************************************************************
17//* This file is free software: you can redistribute it and/or modify *
18//* it under the terms of the GNU General Public License as published by *
19//* the Free Software Foundation, either version 3 of the License, or *
20//* (at your option) any later version. *
21//* *
22//* Primary Authors: Matthias Richter <richterm@scieq.net> *
23//* *
24//* The authors make no claims about the suitability of this software for *
25//* any purpose. It is provided "as is" without express or implied warranty. *
26//****************************************************************************
27
32
33#include <queue>
34#include <mutex>
35#include <condition_variable>
36#include <chrono>
37
38namespace o2
39{
40namespace test
41{
42
58template <class T, class _BASE = std::queue<T>>
59class Fifo : protected _BASE
60{
61 public:
62 Fifo() : mMutex(), mFillStatus(), mStop(false) {}
63 using value_type = T;
64
68 void push(T something, bool isLast = false)
69 {
70 std::lock_guard<std::mutex> lock(mMutex);
71 mStop |= isLast;
72 _BASE::push(something);
73 // notify_one will also work in case of multiple consumers
74 mFillStatus.notify_one();
75 }
76
83 bool empty()
84 {
85 std::lock_guard<std::mutex> lock(mMutex);
86 return _BASE::empty();
87 }
88
94 template <typename F>
95 bool pull(F processor /*, const std::chrono::milliseconds& timeout*/)
96 {
97 T value;
98 {
99 std::unique_lock<std::mutex> lock(mMutex);
100 if (_BASE::empty() && !mStop) {
101 // TODO: proper implementation with timeout with wait_for, return
102 // value will be std::cv_status::no_timeout. The condition variable
103 // is allowed to wake up spuriously, also then the return value is
104 // std::cv_status::no_timeout, so the queue needs to be checked again
105 mFillStatus.wait(lock);
106 }
107 value = _BASE::front();
108 }
109 bool keepGoing = processor(value);
110 {
111 std::unique_lock<std::mutex> lock(mMutex);
112 _BASE::pop();
113 if (mStop && _BASE::empty()) {
114 keepGoing = false;
115 mStop = false;
116 }
117 }
118 return keepGoing;
119 }
120
121 private:
122 std::mutex mMutex;
123 std::condition_variable mFillStatus;
124 bool mStop;
125};
126
127}; // namespace test
128}; // namespace o2
129#endif
A thread safe FIFO.
Definition Fifo.h:60
void push(T something, bool isLast=false)
Definition Fifo.h:68
bool empty()
Definition Fifo.h:83
bool pull(F processor)
Definition Fifo.h:95
GLsizei const GLfloat * value
Definition glcorearb.h:819
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
FIXME: do not use data model tables.