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:
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
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__