diff options
Diffstat (limited to 'libs/pbd3')
-rw-r--r-- | libs/pbd3/SConscript | 9 | ||||
-rw-r--r-- | libs/pbd3/base_ui.cc | 1 | ||||
-rw-r--r-- | libs/pbd3/basename.cc | 31 | ||||
-rw-r--r-- | libs/pbd3/pathscanner.cc | 2 | ||||
-rw-r--r-- | libs/pbd3/pbd/abstract_ui.cc | 2 | ||||
-rw-r--r-- | libs/pbd3/pbd/abstract_ui.h | 5 | ||||
-rw-r--r-- | libs/pbd3/pbd/basename.h | 4 | ||||
-rw-r--r-- | libs/pbd3/pbd/error.h | 18 | ||||
-rw-r--r-- | libs/pbd3/pbd/pool.h | 9 | ||||
-rw-r--r-- | libs/pbd3/pbd/ringbuffer.h | 47 | ||||
-rw-r--r-- | libs/pbd3/pbd/ringbufferNPT.h | 52 | ||||
-rw-r--r-- | libs/pbd3/pbd/transmitter.h | 1 | ||||
-rw-r--r-- | libs/pbd3/pool.cc | 31 | ||||
-rw-r--r-- | libs/pbd3/transmitter.cc | 11 | ||||
-rw-r--r-- | libs/pbd3/undo.cc | 2 |
15 files changed, 105 insertions, 120 deletions
diff --git a/libs/pbd3/SConscript b/libs/pbd3/SConscript index 4d1b2a8681..2766b3c5ed 100644 --- a/libs/pbd3/SConscript +++ b/libs/pbd3/SConscript @@ -10,7 +10,7 @@ pbd3 = env.Copy() domain = 'libpbd' -pbd3.Append(DOMAIN=domain,MAJOR=3,MINOR=2,MICRO=0) +pbd3.Append(DOMAIN=domain,MAJOR=4,MINOR=0,MICRO=0) pbd3.Append(CXXFLAGS="-DPACKAGE=\\\"" + domain + "\\\"") pbd3.Append(CXXFLAGS="-D_REENTRANT -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE") pbd3.Append(CXXFLAGS="-DLIBSIGC_DISABLE_DEPRECATED") @@ -21,8 +21,8 @@ pbd3_files = Split(""" basename.cc base_ui.cc convert.cc -dirname.cc dmalloc.cc +error.cc mountpoint.cc pathscanner.cc pool.cc @@ -33,7 +33,6 @@ strsplit.cc textreceiver.cc transmitter.cc undo.cc -unescape.cc version.cc whitespace.cc xml++.cc @@ -46,7 +45,7 @@ if conf.CheckCHeader('execinfo.h'): conf.env.Append(CXXFLAGS="-DHAVE_EXECINFO") pbd3 = conf.Finish() -pbd3.Merge ([ libraries['sigc2'], libraries['xml'] ]) +pbd3.Merge ([ libraries['sigc2'], libraries['xml'], libraries['glibmm2'], libraries['glib2'] ]) pbd3.VersionBuild(['version.cc','pbd/version.h'], 'SConscript') @@ -60,7 +59,7 @@ if env['NLS']: env.Alias('install', env.Install(os.path.join(install_prefix, 'lib/ardour2'), libpbd3)) env.Alias('tarball', env.Distribute (env['DISTTREE'], - [ 'SConscript', 'i18n.h' ] + + [ 'SConscript', 'i18n.h', 'gettext.h', 'pbd/abstract_ui.cc' ] + pbd3_files + glob.glob('po/*.po') + glob.glob('pbd/*.h'))) diff --git a/libs/pbd3/base_ui.cc b/libs/pbd3/base_ui.cc index 5598b20021..d3c8d5e4c7 100644 --- a/libs/pbd3/base_ui.cc +++ b/libs/pbd3/base_ui.cc @@ -11,6 +11,7 @@ #include "i18n.h" using namespace std; +using namespace PBD; uint32_t BaseUI::rt_bit = 1; BaseUI::RequestType BaseUI::CallSlot = BaseUI::new_request_type(); diff --git a/libs/pbd3/basename.cc b/libs/pbd3/basename.cc index b8c5c64d91..a51e393b78 100644 --- a/libs/pbd3/basename.cc +++ b/libs/pbd3/basename.cc @@ -2,37 +2,10 @@ #include <string.h> #include <pbd/basename.h> -char * -PBD::basename (const char *path) - -{ - char *slash; - - if ((slash = strrchr (path, '/')) == 0) { - return strdup (path); - } - - if (*(slash+1) == '\0') { - return strdup (""); - } - - return strdup (slash+1); -} - -std::string -PBD::basename (const std::string str) -{ - std::string::size_type slash = str.find_last_of ('/'); - - if (slash == std::string::npos) { - return str; - } - - return str.substr (slash+1); -} +// implement this using Glib::path_get_basename std::string -PBD::basename_nosuffix (const std::string str) +PBD::basename_nosuffix (const std::string& str) { std::string::size_type slash = str.find_last_of ('/'); std::string noslash; diff --git a/libs/pbd3/pathscanner.cc b/libs/pbd3/pathscanner.cc index 5b96284a90..2af227a3a0 100644 --- a/libs/pbd3/pathscanner.cc +++ b/libs/pbd3/pathscanner.cc @@ -27,6 +27,8 @@ #include <pbd/pathscanner.h> #include <pbd/stl_delete.h> +using namespace PBD; + vector<string *> * PathScanner::operator() (const string &dirpath, const string ®exp, bool match_fullpath, bool return_fullpath, diff --git a/libs/pbd3/pbd/abstract_ui.cc b/libs/pbd3/pbd/abstract_ui.cc index 06cf1665a3..0e34787a2d 100644 --- a/libs/pbd3/pbd/abstract_ui.cc +++ b/libs/pbd3/pbd/abstract_ui.cc @@ -29,7 +29,7 @@ AbstractUI<RequestObject>::register_thread_with_request_count (pthread_t thread_ RequestBuffer* b = new RequestBuffer (num_requests); { - PBD::LockMonitor lm (request_buffer_map_lock, __LINE__, __FILE__); + Glib::Mutex::Lock lm (request_buffer_map_lock); request_buffers[thread_id] = b; } diff --git a/libs/pbd3/pbd/abstract_ui.h b/libs/pbd3/pbd/abstract_ui.h index 98f077cb48..f80db7bf1a 100644 --- a/libs/pbd3/pbd/abstract_ui.h +++ b/libs/pbd3/pbd/abstract_ui.h @@ -27,8 +27,9 @@ #include <sigc++/sigc++.h> +#include <glibmm/thread.h> + #include <pbd/receiver.h> -#include <pbd/lockmonitor.h> #include <pbd/ringbufferNPT.h> #include <pbd/base_ui.h> @@ -62,7 +63,7 @@ class AbstractUI : public BaseUI typedef typename RequestBuffer::rw_vector RequestBufferVector; typedef typename std::map<pthread_t,RequestBuffer*>::iterator RequestBufferMapIterator; - PBD::Lock request_buffer_map_lock; + Glib::Mutex request_buffer_map_lock; typedef std::map<pthread_t,RequestBuffer*> RequestBufferMap; RequestBufferMap request_buffers; pthread_key_t thread_request_buffer_key; diff --git a/libs/pbd3/pbd/basename.h b/libs/pbd3/pbd/basename.h index 01f40b6b6a..35aebe166c 100644 --- a/libs/pbd3/pbd/basename.h +++ b/libs/pbd3/pbd/basename.h @@ -6,9 +6,7 @@ namespace PBD { -extern char *basename (const char *); -extern std::string basename (const std::string); -extern std::string basename_nosuffix (const std::string); +extern std::string basename_nosuffix (const std::string&); }; diff --git a/libs/pbd3/pbd/error.h b/libs/pbd3/pbd/error.h index cb822e6210..4136f02ee2 100644 --- a/libs/pbd3/pbd/error.h +++ b/libs/pbd3/pbd/error.h @@ -1,5 +1,5 @@ /* - Copyright (C) 1998-99 Paul Barton-Davis + Copyright (C) 1998-2006 Paul 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 @@ -17,14 +17,16 @@ $Id$ */ -#ifndef __libmisc_error_h__ -#define __libmisc_error_h__ +#ifndef __libpbd_error_h__ +#define __libpbd_error_h__ #include "transmitter.h" -extern Transmitter error; -extern Transmitter info; -extern Transmitter warning; -extern Transmitter fatal; +namespace PBD { + extern Transmitter error; + extern Transmitter info; + extern Transmitter warning; + extern Transmitter fatal; +} -#endif // __libmisc_error_h__ +#endif // __libpbd_error_h__ diff --git a/libs/pbd3/pbd/pool.h b/libs/pbd3/pbd/pool.h index c8e9740acd..f8e19e72fb 100644 --- a/libs/pbd3/pbd/pool.h +++ b/libs/pbd3/pbd/pool.h @@ -23,7 +23,9 @@ #include <vector> #include <string> -#include <pthread.h> + +#include <glibmm/thread.h> + #include <pbd/ringbuffer.h> class Pool @@ -53,7 +55,7 @@ class SingleAllocMultiReleasePool : public Pool virtual void release (void *); private: - pthread_mutex_t lock; + Glib::Mutex* m_lock; }; @@ -67,8 +69,7 @@ class MultiAllocSingleReleasePool : public Pool virtual void release (void *); private: - pthread_mutex_t lock; + Glib::Mutex* m_lock; }; - #endif // __qm_pool_h__ diff --git a/libs/pbd3/pbd/ringbuffer.h b/libs/pbd3/pbd/ringbuffer.h index d276d19086..1d9c9b04e3 100644 --- a/libs/pbd3/pbd/ringbuffer.h +++ b/libs/pbd3/pbd/ringbuffer.h @@ -21,8 +21,9 @@ #ifndef ringbuffer_h #define ringbuffer_h -#include <sys/mman.h> -#include <pbd/atomic.h> +//#include <sys/mman.h> + +#include <glib.h> template<class T> class RingBuffer @@ -47,14 +48,14 @@ class RingBuffer void reset () { /* !!! NOT THREAD SAFE !!! */ - atomic_set (&write_ptr, 0); - atomic_set (&read_ptr, 0); + g_atomic_int_set (&write_ptr, 0); + g_atomic_int_set (&read_ptr, 0); } void set (size_t r, size_t w) { /* !!! NOT THREAD SAFE !!! */ - atomic_set (&write_ptr, w); - atomic_set (&read_ptr, r); + g_atomic_int_set (&write_ptr, w); + g_atomic_int_set (&read_ptr, r); } size_t read (T *dest, size_t cnt); @@ -69,22 +70,22 @@ class RingBuffer void get_write_vector (rw_vector *); void decrement_read_ptr (size_t cnt) { - atomic_set (&read_ptr, (atomic_read(&read_ptr) - cnt) & size_mask); + g_atomic_int_set (&read_ptr, (g_atomic_int_get(&read_ptr) - cnt) & size_mask); } void increment_read_ptr (size_t cnt) { - atomic_set (&read_ptr, (atomic_read(&read_ptr) + cnt) & size_mask); + g_atomic_int_set (&read_ptr, (g_atomic_int_get(&read_ptr) + cnt) & size_mask); } void increment_write_ptr (size_t cnt) { - atomic_set (&write_ptr, (atomic_read(&write_ptr) + cnt) & size_mask); + g_atomic_int_set (&write_ptr, (g_atomic_int_get(&write_ptr) + cnt) & size_mask); } size_t write_space () { size_t w, r; - w = atomic_read (&write_ptr); - r = atomic_read (&read_ptr); + w = g_atomic_int_get (&write_ptr); + r = g_atomic_int_get (&read_ptr); if (w > r) { return ((r - w + size) & size_mask) - 1; @@ -98,8 +99,8 @@ class RingBuffer size_t read_space () { size_t w, r; - w = atomic_read (&write_ptr); - r = atomic_read (&read_ptr); + w = g_atomic_int_get (&write_ptr); + r = g_atomic_int_get (&read_ptr); if (w > r) { return w - r; @@ -109,8 +110,8 @@ class RingBuffer } T *buffer () { return buf; } - size_t get_write_ptr () const { return atomic_read (&write_ptr); } - size_t get_read_ptr () const { return atomic_read (&read_ptr); } + size_t get_write_ptr () const { return g_atomic_int_get (&write_ptr); } + size_t get_read_ptr () const { return g_atomic_int_get (&read_ptr); } size_t bufsize () const { return size; } protected: @@ -130,7 +131,7 @@ RingBuffer<T>::read (T *dest, size_t cnt) size_t n1, n2; size_t priv_read_ptr; - priv_read_ptr=atomic_read(&read_ptr); + priv_read_ptr=g_atomic_int_get(&read_ptr); if ((free_cnt = read_space ()) == 0) { return 0; @@ -156,7 +157,7 @@ RingBuffer<T>::read (T *dest, size_t cnt) priv_read_ptr = n2; } - atomic_set(&read_ptr, priv_read_ptr); + g_atomic_int_set(&read_ptr, priv_read_ptr); return to_read; } @@ -170,7 +171,7 @@ RingBuffer<T>::write (T *src, size_t cnt) size_t n1, n2; size_t priv_write_ptr; - priv_write_ptr=atomic_read(&write_ptr); + priv_write_ptr=g_atomic_int_get(&write_ptr); if ((free_cnt = write_space ()) == 0) { return 0; @@ -196,7 +197,7 @@ RingBuffer<T>::write (T *src, size_t cnt) priv_write_ptr = n2; } - atomic_set(&write_ptr, priv_write_ptr); + g_atomic_int_set(&write_ptr, priv_write_ptr); return to_write; } @@ -208,8 +209,8 @@ RingBuffer<T>::get_read_vector (RingBuffer<T>::rw_vector *vec) size_t cnt2; size_t w, r; - w = atomic_read (&write_ptr); - r = atomic_read (&read_ptr); + w = g_atomic_int_get (&write_ptr); + r = g_atomic_int_get (&read_ptr); if (w > r) { free_cnt = w - r; @@ -248,8 +249,8 @@ RingBuffer<T>::get_write_vector (RingBuffer<T>::rw_vector *vec) size_t cnt2; size_t w, r; - w = atomic_read (&write_ptr); - r = atomic_read (&read_ptr); + w = g_atomic_int_get (&write_ptr); + r = g_atomic_int_get (&read_ptr); if (w > r) { free_cnt = ((r - w + size) & size_mask) - 1; diff --git a/libs/pbd3/pbd/ringbufferNPT.h b/libs/pbd3/pbd/ringbufferNPT.h index ccfcae42a5..fee2efce3d 100644 --- a/libs/pbd3/pbd/ringbufferNPT.h +++ b/libs/pbd3/pbd/ringbufferNPT.h @@ -21,12 +21,12 @@ #ifndef ringbuffer_npt_h #define ringbuffer_npt_h -#include <sys/mman.h> -#include <pbd/atomic.h> +//#include <sys/mman.h> + +#include <glib.h> + +/* ringbuffer class where the element size is not required to be a power of two */ -/** Ringbuffer class where the element size is not required to be a - * power of two. - */ template<class T> class RingBufferNPT { @@ -44,14 +44,14 @@ class RingBufferNPT void reset () { /* !!! NOT THREAD SAFE !!! */ - atomic_set (&write_ptr, 0); - atomic_set (&read_ptr, 0); + g_atomic_int_set (&write_ptr, 0); + g_atomic_int_set (&read_ptr, 0); } void set (size_t r, size_t w) { /* !!! NOT THREAD SAFE !!! */ - atomic_set (&write_ptr, w); - atomic_set (&read_ptr, r); + g_atomic_int_set (&write_ptr, w); + g_atomic_int_set (&read_ptr, r); } size_t read (T *dest, size_t cnt); @@ -66,22 +66,22 @@ class RingBufferNPT void get_write_vector (rw_vector *); void decrement_read_ptr (size_t cnt) { - atomic_set (&read_ptr, (atomic_read(&read_ptr) - cnt) % size); + g_atomic_int_set (&read_ptr, (g_atomic_int_get(&read_ptr) - cnt) % size); } void increment_read_ptr (size_t cnt) { - atomic_set (&read_ptr, (atomic_read(&read_ptr) + cnt) % size); + g_atomic_int_set (&read_ptr, (g_atomic_int_get(&read_ptr) + cnt) % size); } void increment_write_ptr (size_t cnt) { - atomic_set (&write_ptr, (atomic_read(&write_ptr) + cnt) % size); + g_atomic_int_set (&write_ptr, (g_atomic_int_get(&write_ptr) + cnt) % size); } size_t write_space () { size_t w, r; - w = atomic_read (&write_ptr); - r = atomic_read (&read_ptr); + w = g_atomic_int_get (&write_ptr); + r = g_atomic_int_get (&read_ptr); if (w > r) { return ((r - w + size) % size) - 1; @@ -95,8 +95,8 @@ class RingBufferNPT size_t read_space () { size_t w, r; - w = atomic_read (&write_ptr); - r = atomic_read (&read_ptr); + w = g_atomic_int_get (&write_ptr); + r = g_atomic_int_get (&read_ptr); if (w > r) { return w - r; @@ -106,8 +106,8 @@ class RingBufferNPT } T *buffer () { return buf; } - size_t get_write_ptr () const { return atomic_read (&write_ptr); } - size_t get_read_ptr () const { return atomic_read (&read_ptr); } + size_t get_write_ptr () const { return g_atomic_int_get (&write_ptr); } + size_t get_read_ptr () const { return g_atomic_int_get (&read_ptr); } size_t bufsize () const { return size; } protected: @@ -126,7 +126,7 @@ RingBufferNPT<T>::read (T *dest, size_t cnt) size_t n1, n2; size_t priv_read_ptr; - priv_read_ptr=atomic_read(&read_ptr); + priv_read_ptr=g_atomic_int_get(&read_ptr); if ((free_cnt = read_space ()) == 0) { return 0; @@ -152,7 +152,7 @@ RingBufferNPT<T>::read (T *dest, size_t cnt) priv_read_ptr = n2; } - atomic_set(&read_ptr, priv_read_ptr); + g_atomic_int_set(&read_ptr, priv_read_ptr); return to_read; } @@ -165,7 +165,7 @@ RingBufferNPT<T>::write (T *src, size_t cnt) size_t n1, n2; size_t priv_write_ptr; - priv_write_ptr=atomic_read(&write_ptr); + priv_write_ptr=g_atomic_int_get(&write_ptr); if ((free_cnt = write_space ()) == 0) { return 0; @@ -191,7 +191,7 @@ RingBufferNPT<T>::write (T *src, size_t cnt) priv_write_ptr = n2; } - atomic_set(&write_ptr, priv_write_ptr); + g_atomic_int_set(&write_ptr, priv_write_ptr); return to_write; } @@ -202,8 +202,8 @@ RingBufferNPT<T>::get_read_vector (RingBufferNPT<T>::rw_vector *vec) size_t cnt2; size_t w, r; - w = atomic_read (&write_ptr); - r = atomic_read (&read_ptr); + w = g_atomic_int_get (&write_ptr); + r = g_atomic_int_get (&read_ptr); if (w > r) { free_cnt = w - r; @@ -241,8 +241,8 @@ RingBufferNPT<T>::get_write_vector (RingBufferNPT<T>::rw_vector *vec) size_t cnt2; size_t w, r; - w = atomic_read (&write_ptr); - r = atomic_read (&read_ptr); + w = g_atomic_int_get (&write_ptr); + r = g_atomic_int_get (&read_ptr); if (w > r) { free_cnt = ((r - w + size) % size) - 1; diff --git a/libs/pbd3/pbd/transmitter.h b/libs/pbd3/pbd/transmitter.h index 07fc266bce..357cb9965f 100644 --- a/libs/pbd3/pbd/transmitter.h +++ b/libs/pbd3/pbd/transmitter.h @@ -104,6 +104,7 @@ endmsg (std::ostream &ostr) return ostr; } + extern "C" { void pbd_c_error (const char *); } #endif // __libmisc_transmitter_h__ diff --git a/libs/pbd3/pool.cc b/libs/pbd3/pool.cc index f05d88381c..089766482d 100644 --- a/libs/pbd3/pool.cc +++ b/libs/pbd3/pool.cc @@ -19,15 +19,13 @@ */ #include <iostream> -#include <sys/mman.h> #include <vector> #include <pbd/pool.h> #include <pbd/error.h> -#include <pbd/stl_delete.h> -#include <pbd/pthread_utils.h> using namespace std; +using namespace PBD; Pool::Pool (string n, unsigned long item_size, unsigned long nitems) { @@ -84,32 +82,39 @@ Pool::release (void *ptr) /*---------------------------------------------*/ MultiAllocSingleReleasePool::MultiAllocSingleReleasePool (string n, unsigned long isize, unsigned long nitems) - : Pool (n, isize, nitems) + : Pool (n, isize, nitems), + m_lock(0) { - pthread_mutex_init (&lock, 0); } MultiAllocSingleReleasePool::~MultiAllocSingleReleasePool () { + if(m_lock) delete m_lock; } SingleAllocMultiReleasePool::SingleAllocMultiReleasePool (string n, unsigned long isize, unsigned long nitems) - : Pool (n, isize, nitems) + : Pool (n, isize, nitems), + m_lock(0) { - pthread_mutex_init (&lock, 0); } SingleAllocMultiReleasePool::~SingleAllocMultiReleasePool () { + if(m_lock) delete m_lock; } void* MultiAllocSingleReleasePool::alloc () { void *ptr; - pthread_mutex_lock (&lock); + if(!m_lock) { + m_lock = new Glib::Mutex(); + // umm, I'm not sure that this doesn't also allocate memory. + if(!m_lock) error << "cannot create Glib::Mutex in pool.cc" << endmsg; + } + + Glib::Mutex::Lock guard(*m_lock); ptr = Pool::alloc (); - pthread_mutex_unlock (&lock); return ptr; } @@ -128,8 +133,12 @@ SingleAllocMultiReleasePool::alloc () void SingleAllocMultiReleasePool::release (void* ptr) { - pthread_mutex_lock (&lock); + if(!m_lock) { + m_lock = new Glib::Mutex(); + // umm, I'm not sure that this doesn't also allocate memory. + if(!m_lock) error << "cannot create Glib::Mutex in pool.cc" << endmsg; + } + Glib::Mutex::Lock guard(*m_lock); Pool::release (ptr); - pthread_mutex_unlock (&lock); } diff --git a/libs/pbd3/transmitter.cc b/libs/pbd3/transmitter.cc index 63f676a04f..876a9d86e5 100644 --- a/libs/pbd3/transmitter.cc +++ b/libs/pbd3/transmitter.cc @@ -24,17 +24,12 @@ #include <string> #include <pbd/transmitter.h> +#include <pbd/error.h> using std::string; using std::ios; -Transmitter error (Transmitter::Error); -Transmitter info (Transmitter::Info); -Transmitter fatal (Transmitter::Fatal); -Transmitter warning (Transmitter::Warning); - Transmitter::Transmitter (Channel c) - { channel = c; switch (c) { @@ -110,11 +105,11 @@ Transmitter::does_not_return () } } + extern "C" { void pbd_c_error (const char *str) { - extern Transmitter error; - error << str << endmsg; + PBD::error << str << endmsg; } } diff --git a/libs/pbd3/undo.cc b/libs/pbd3/undo.cc index 0af1cc2e7a..f2f11b1c5c 100644 --- a/libs/pbd3/undo.cc +++ b/libs/pbd3/undo.cc @@ -77,6 +77,7 @@ UndoCommand::clear () void UndoCommand::undo () { + cerr << "Undo " << _name << endl; for (list<UndoAction>::reverse_iterator i = undo_actions.rbegin(); i != undo_actions.rend(); ++i) { (*i)(); } @@ -85,6 +86,7 @@ UndoCommand::undo () void UndoCommand::redo () { + cerr << "Redo " << _name << endl; for (list<UndoAction>::iterator i = redo_actions.begin(); i != redo_actions.end(); ++i) { (*i)(); } |