X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fpbd%2Fpool.h;h=edc247332e2aacb6dd0e603e5f09c5bce52e57d7;hb=ea48c56061aa7324b076ab01ee408005a46bae8e;hp=165a3aac4bc95606dd0f12b1263c36b43b34e061;hpb=a882e96db1367c26660fd3d3079e9e3e19b1e149;p=ardour.git diff --git a/libs/pbd/pbd/pool.h b/libs/pbd/pbd/pool.h index 165a3aac4b..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 @@ -31,7 +31,7 @@ /** A pool of data items that can be allocated, read from and written to * without system memory allocation or locking. */ -class LIBPBD_API Pool +class LIBPBD_API Pool { public: Pool (std::string name, unsigned long item_size, unsigned long nitems); @@ -39,8 +39,11 @@ class LIBPBD_API 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 @@ -48,6 +51,9 @@ class LIBPBD_API Pool private: void *block; ///< data storage area +#ifndef NDEBUG + unsigned long max_usage; +#endif }; class LIBPBD_API SingleAllocMultiReleasePool : public Pool @@ -81,15 +87,15 @@ 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 LIBPBD_API CrossThreadPool : public Pool { @@ -104,7 +110,11 @@ class LIBPBD_API 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; @@ -121,16 +131,14 @@ class LIBPBD_API 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;