tweak transport bar spacing
[ardour.git] / libs / pbd / pbd / pool.h
index f8e19e72fb9281ec360026693062a330dd2a06cd..ab06343b4adfa3b649c91f79185f4eddee729603 100644 (file)
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #ifndef __qm_pool_h__
 
 #include <glibmm/thread.h>
 
-#include <pbd/ringbuffer.h>
+#include "pbd/ringbuffer.h"
 
+/** A pool of data items that can be allocated, read from and written to
+ *  without system memory allocation or locking.
+ */
 class Pool 
 {
   public:
@@ -39,10 +41,12 @@ class Pool
        
        std::string name() const { return _name; }
 
-  private:
-       RingBuffer<void*>* free_list;
+  protected:
+       RingBuffer<void*> free_list; ///< a list of pointers to free items within block
        std::string _name;
-       void *block;
+
+  private:
+       void *block; ///< data storage area
 };
 
 class SingleAllocMultiReleasePool : public Pool
@@ -72,4 +76,53 @@ class MultiAllocSingleReleasePool : public Pool
     Glib::Mutex* m_lock;
 };
 
+class PerThreadPool;
+
+/** A per-thread pool of data */
+class CrossThreadPool : public Pool
+{
+  public:
+       CrossThreadPool (std::string n, unsigned long isize, unsigned long nitems, PerThreadPool *);
+
+       void* alloc ();
+       void push (void *);
+
+       PerThreadPool* parent () const {
+               return _parent;
+       }
+
+       bool empty ();
+       
+  private:
+       RingBuffer<void*> pending;
+       PerThreadPool* _parent;
+};
+
+/** A class to manage per-thread pools of memory.  One object of this class is instantiated,
+ *  and then it is used to create per-thread pools as required.
+ */
+class PerThreadPool
+{
+  public:
+       PerThreadPool ();
+
+       GPrivate* key() const { return _key; }
+
+       void  create_per_thread_pool (std::string name, unsigned long item_size, unsigned long nitems);
+       CrossThreadPool* per_thread_pool ();
+
+       void set_trash (RingBuffer<CrossThreadPool*>* t);
+       void add_to_trash (CrossThreadPool *);
+
+  private:
+       GPrivate* _key;
+       std::string _name;
+       unsigned long _item_size;
+       unsigned long _nitems;
+
+       /** mutex to protect either changes to the _trash variable, or writes to the RingBuffer */
+       Glib::Mutex _trash_mutex;
+       RingBuffer<CrossThreadPool*>* _trash;
+};
+
 #endif // __qm_pool_h__