+2004-07-01 Benjamin Kosnik <bkoz@redhat.com>
+ Per Bothner <per@bothner.com >
+ Mohan Embar <gnustuff@thisiscool.com>
+
+ PR libstdc++/16248
+ * include/bits/concurrence.h (__glibcxx_mutex_type): New.
+ (__glibcxx_mutex): Encapsulate mutex init function into type for
+ threaded configurations without __GTHREAD_MUTEX_INIT.
+ (lock::lock): Make device member a reference.
+ (lock::~lock): Same.
+ * include/ext/pool_allocator.h (__pool_base::_M_get_mutex): Change
+ to mutex_type.
+ * src/allocator.cc: Same.
+
2004-06-30 Brad Spencer <spencer@infointeractive.com>
* include/ext/mt_allocator.h: Handle allocations at static
#if __GTHREADS
# ifdef __GTHREAD_MUTEX_INIT
+# define __glibcxx_mutex_type __gthread_mutex_t
# define __glibcxx_mutex_define_initialized(NAME) \
__gthread_mutex_t NAME = __GTHREAD_MUTEX_INIT
# define __glibcxx_mutex_lock(NAME) \
__gthread_mutex_lock(&NAME)
# else
// Implies __GTHREAD_MUTEX_INIT_FUNCTION
+struct __glibcxx_mutex : public __gthread_mutex_t
+{
+ __glibcxx_mutex() { __GTHREAD_MUTEX_INIT_FUNCTION(this); }
+};
+
+# define __glibcxx_mutex_type __glibcxx_mutex
# define __glibcxx_mutex_define_initialized(NAME) \
-__gthread_mutex_t NAME; \
-__gthread_once_t NAME ## _once = __GTHREAD_ONCE_INIT; \
-void NAME ## _init() { __GTHREAD_MUTEX_INIT_FUNCTION(&NAME); }
+__glibcxx_mutex NAME
# define __glibcxx_mutex_lock(NAME) \
-__gthread_once(&NAME ## _once, NAME ## _init); \
__gthread_mutex_lock(&NAME)
# endif
#else
+# define __glibcxx_mutex_type __gthread_mutex_t
# define __glibcxx_mutex_define_initialized(NAME) __gthread_mutex_t NAME
# define __glibcxx_mutex_lock(NAME)
# define __glibcxx_mutex_unlock(NAME)
namespace __gnu_cxx
{
+ typedef __glibcxx_mutex_type mutex_type;
+
class lock
{
// Externally defined and initialized.
- __gthread_mutex_t* device;
+ mutex_type& device;
public:
// Acquire the mutex here with a constructor call. This ensures
// that it is released in exit or during stack unwinding.
- explicit lock(__gthread_mutex_t& name) : device(&name)
- { __glibcxx_mutex_lock(*device); }
+ explicit lock(mutex_type& name) : device(name)
+ { __glibcxx_mutex_lock(device); }
~lock() throw()
- { __glibcxx_mutex_unlock(*device); }
+ { __glibcxx_mutex_unlock(device); }
private:
lock(const lock&);