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>
* include/ext/mt_allocator.h: Handle allocations at static

View File

@ -37,18 +37,22 @@
#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
@ -56,6 +60,7 @@ __gthread_mutex_lock(&NAME)
#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)
@ -64,19 +69,21 @@ __gthread_mutex_lock(&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&);

View File

@ -100,7 +100,7 @@ namespace __gnu_cxx
_Obj* volatile*
_M_get_free_list(size_t __bytes);
__gthread_mutex_t&
mutex_type&
_M_get_mutex();
// 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;
}
__gthread_mutex_t&
mutex_type&
__pool_base::_M_get_mutex()
{ return __gnu_internal::palloc_init_mutex; }