Per Bothner <per@bothner.com > Mohan Embar <gnustuff@thisiscool.com>

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.

Co-Authored-By: Mohan Embar <gnustuff@thisiscool.com>
Co-Authored-By: Per Bothner <per@bothner.com>

From-SVN: r83985
This commit is contained in:
Benjamin Kosnik 2004-07-01 14:49:29 +00:00 committed by Benjamin Kosnik
parent 60ba25bfc1
commit f65d320115
4 changed files with 31 additions and 10 deletions

View File

@ -1,3 +1,17 @@
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> 2004-06-30 Brad Spencer <spencer@infointeractive.com>
* include/ext/mt_allocator.h: Handle allocations at static * include/ext/mt_allocator.h: Handle allocations at static

View File

@ -37,18 +37,22 @@
#if __GTHREADS #if __GTHREADS
# ifdef __GTHREAD_MUTEX_INIT # ifdef __GTHREAD_MUTEX_INIT
# define __glibcxx_mutex_type __gthread_mutex_t
# define __glibcxx_mutex_define_initialized(NAME) \ # define __glibcxx_mutex_define_initialized(NAME) \
__gthread_mutex_t NAME = __GTHREAD_MUTEX_INIT __gthread_mutex_t NAME = __GTHREAD_MUTEX_INIT
# define __glibcxx_mutex_lock(NAME) \ # define __glibcxx_mutex_lock(NAME) \
__gthread_mutex_lock(&NAME) __gthread_mutex_lock(&NAME)
# else # else
// Implies __GTHREAD_MUTEX_INIT_FUNCTION // 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) \ # define __glibcxx_mutex_define_initialized(NAME) \
__gthread_mutex_t NAME; \ __glibcxx_mutex NAME
__gthread_once_t NAME ## _once = __GTHREAD_ONCE_INIT; \
void NAME ## _init() { __GTHREAD_MUTEX_INIT_FUNCTION(&NAME); }
# define __glibcxx_mutex_lock(NAME) \ # define __glibcxx_mutex_lock(NAME) \
__gthread_once(&NAME ## _once, NAME ## _init); \
__gthread_mutex_lock(&NAME) __gthread_mutex_lock(&NAME)
# endif # endif
@ -56,6 +60,7 @@ __gthread_mutex_lock(&NAME)
#else #else
# define __glibcxx_mutex_type __gthread_mutex_t
# define __glibcxx_mutex_define_initialized(NAME) __gthread_mutex_t NAME # define __glibcxx_mutex_define_initialized(NAME) __gthread_mutex_t NAME
# define __glibcxx_mutex_lock(NAME) # define __glibcxx_mutex_lock(NAME)
# define __glibcxx_mutex_unlock(NAME) # define __glibcxx_mutex_unlock(NAME)
@ -64,19 +69,21 @@ __gthread_mutex_lock(&NAME)
namespace __gnu_cxx namespace __gnu_cxx
{ {
typedef __glibcxx_mutex_type mutex_type;
class lock class lock
{ {
// Externally defined and initialized. // Externally defined and initialized.
__gthread_mutex_t* device; mutex_type& device;
public: public:
// Acquire the mutex here with a constructor call. This ensures // Acquire the mutex here with a constructor call. This ensures
// that it is released in exit or during stack unwinding. // that it is released in exit or during stack unwinding.
explicit lock(__gthread_mutex_t& name) : device(&name) explicit lock(mutex_type& name) : device(name)
{ __glibcxx_mutex_lock(*device); } { __glibcxx_mutex_lock(device); }
~lock() throw() ~lock() throw()
{ __glibcxx_mutex_unlock(*device); } { __glibcxx_mutex_unlock(device); }
private: private:
lock(const lock&); lock(const lock&);

View File

@ -100,7 +100,7 @@ namespace __gnu_cxx
_Obj* volatile* _Obj* volatile*
_M_get_free_list(size_t __bytes); _M_get_free_list(size_t __bytes);
__gthread_mutex_t& mutex_type&
_M_get_mutex(); _M_get_mutex();
// Returns an object of size __n, and optionally adds to size __n // Returns an object of size __n, and optionally adds to size __n

View File

@ -51,7 +51,7 @@ namespace __gnu_cxx
return _S_free_list + __i; return _S_free_list + __i;
} }
__gthread_mutex_t& mutex_type&
__pool_base::_M_get_mutex() __pool_base::_M_get_mutex()
{ return __gnu_internal::palloc_init_mutex; } { return __gnu_internal::palloc_init_mutex; }