X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpbd%2Fpool.h;h=edc247332e2aacb6dd0e603e5f09c5bce52e57d7;hb=ea48c56061aa7324b076ab01ee408005a46bae8e;hp=58c5861d23341260dabdd9b4a5c71cdea13a0a61;hpb=b924ba9cebfa6b720ee7878dbf894e1d63990fef;p=ardour.git diff --git a/libs/pbd/pbd/pool.h b/libs/pbd/pbd/pool.h index 58c5861d23..edc247332e 100644 --- a/libs/pbd/pbd/pool.h +++ b/libs/pbd/pbd/pool.h @@ -1,6 +1,6 @@ /* Copyright (C) 1998-99 Paul Barton-Davis - + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or @@ -25,12 +25,13 @@ #include +#include "pbd/libpbd_visibility.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 +class LIBPBD_API Pool { public: Pool (std::string name, unsigned long item_size, unsigned long nitems); @@ -38,8 +39,11 @@ class Pool virtual void *alloc (); virtual void release (void *); - + std::string name() const { return _name; } + guint available() const { return free_list.read_space(); } + guint used() const { return free_list.bufsize() - available(); } + guint total() const { return free_list.bufsize(); } protected: RingBuffer free_list; ///< a list of pointers to free items within block @@ -47,9 +51,12 @@ class Pool private: void *block; ///< data storage area +#ifndef NDEBUG + unsigned long max_usage; +#endif }; -class SingleAllocMultiReleasePool : public Pool +class LIBPBD_API SingleAllocMultiReleasePool : public Pool { public: SingleAllocMultiReleasePool (std::string name, unsigned long item_size, unsigned long nitems); @@ -63,7 +70,7 @@ class SingleAllocMultiReleasePool : public Pool }; -class MultiAllocSingleReleasePool : public Pool +class LIBPBD_API MultiAllocSingleReleasePool : public Pool { public: MultiAllocSingleReleasePool (std::string name, unsigned long item_size, unsigned long nitems); @@ -76,21 +83,21 @@ class MultiAllocSingleReleasePool : public Pool Glib::Threads::Mutex m_lock; }; -class PerThreadPool; +class LIBPBD_API PerThreadPool; /** Management of a per-thread pool of data that is allocated by one thread and * freed by one other thread. Not safe for use when there is more than 1 - * reader and 1 writer. + * reader and 1 writer. * - * This is basically a wrapper around a thread-local storage instance of a + * This is basically a wrapper around a thread-local storage instance of a * ringbuffer, made safe for use in the case where multiple threads allocate * from the ringbuffer and a single thread "frees" the allocations. - * + * * Rather than using locks, each thread has its own ringbuffer (and associated * data), and so it calls alloc(), passes a pointer to the result of the alloc - * to another thread, which later calls push() to "free" it. + * to another thread, which later calls push() to "free" it. */ -class CrossThreadPool : public Pool +class LIBPBD_API CrossThreadPool : public Pool { public: CrossThreadPool (std::string n, unsigned long isize, unsigned long nitems, PerThreadPool *); @@ -103,7 +110,11 @@ class CrossThreadPool : public Pool } bool empty (); - + guint pending_size() const { return pending.read_space(); } + + void flush_pending (); + void flush_pending_with_ev (void*); + private: RingBuffer pending; PerThreadPool* _parent; @@ -112,7 +123,7 @@ class CrossThreadPool : public Pool /** 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 for 1 or more threads as required. */ -class PerThreadPool +class LIBPBD_API PerThreadPool { public: PerThreadPool (); @@ -120,16 +131,14 @@ class PerThreadPool const Glib::Threads::Private& key() const { return _key; } void create_per_thread_pool (std::string name, unsigned long item_size, unsigned long nitems); - CrossThreadPool* per_thread_pool (); - + CrossThreadPool* per_thread_pool (bool must_exist = true); + bool has_per_thread_pool (); void set_trash (RingBuffer* t); void add_to_trash (CrossThreadPool *); private: Glib::Threads::Private _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::Threads::Mutex _trash_mutex;