iLab Neuromorphic Robotics Toolkit  0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
BoundedBuffer.H
Go to the documentation of this file.
1 /*! @file
2  @author Laurent Itti
3  @copyright GNU Public License (GPL v3)
4  @section License
5  @verbatim
6  // ////////////////////////////////////////////////////////////////////////
7  // The iLab Neuromorphic Robotics Toolkit (NRT) //
8  // Copyright 2010-2012 by the University of Southern California (USC) //
9  // and the iLab at USC. //
10  // //
11  // iLab - University of Southern California //
12  // Hedco Neurociences Building, Room HNB-10 //
13  // Los Angeles, Ca 90089-2520 - USA //
14  // //
15  // See http://ilab.usc.edu for information about this project. //
16  // ////////////////////////////////////////////////////////////////////////
17  // This file is part of The iLab Neuromorphic Robotics Toolkit. //
18  // //
19  // The iLab Neuromorphic Robotics Toolkit is free software: you can //
20  // redistribute it and/or modify it under the terms of the GNU General //
21  // Public License as published by the Free Software Foundation, either //
22  // version 3 of the License, or (at your option) any later version. //
23  // //
24  // The iLab Neuromorphic Robotics Toolkit is distributed in the hope //
25  // that it will be useful, but WITHOUT ANY WARRANTY; without even the //
26  // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //
27  // PURPOSE. See the GNU General Public License for more details. //
28  // //
29  // You should have received a copy of the GNU General Public License //
30  // along with The iLab Neuromorphic Robotics Toolkit. If not, see //
31  // <http://www.gnu.org/licenses/>. //
32  // ////////////////////////////////////////////////////////////////////////
33  @endverbatim */
34 
35 
36 #ifndef INCLUDE_NRT_CORE_DESIGN_BOUNDEDBUFFER_H
37 #define INCLUDE_NRT_CORE_DESIGN_BOUNDEDBUFFER_H
38 
40 #include <queue>
41 
42 namespace nrt
43 {
44  //! Thread-safe synchronized producer/consumer queue
45  /*! BoundedBuffer is designed for use in producer/consumer scenarios where multiple threads wish to push and pop data
46  onto/from the buffer asynchronously. Threads that try to pop data when the buffer is empty will sleep until data
47  is actually available, and threads that try to push data when the buffer is full will block until some space is
48  available in the buffer.
49 
50  \ingroup design */
51  template <class T>
53  {
54  public:
55  //! Create a new BoundedBuffer with no data
56  BoundedBuffer(size_t const siz);
57 
58  //! Push a new data element into the buffer, potentially sleeping if buffer is full
59  void push(T const & val);
60 
61  //! Pop oldest data element off of the buffer, potentially sleeping until one is available
62  T pop();
63 
64  //! Current number of items actually in the buffer
65  size_t const filled_size();
66 
67  //! Max size of the buffer
68  size_t const size() const;
69 
70  private:
71  size_t const itsSize;
72  std::queue<T> itsQueue;
73  nrt::Semaphore itsEmptySemaphore, itsFullSemaphore;
74  std::mutex itsMutex;
75  };
76 } // namespace nrt
77 
79 
80 #endif // INCLUDE_NRT_CORE_DESIGN_BOUNDEDBUFFER_H
81