Hi all,

I hope someone can help me. I am C++ impaired, and I am getting
the following error when trying to bootstrap the current 4.0.2
CVS. The error is coming from include/ext/bitmap_allocator.h
line 111. The relevant code snippet is:

class _Mutex {
  __gthread_mutex_t _M_mut;

  // Prevent Copying and assignment.
  _Mutex(_Mutex const&);
  _Mutex& operator=(_Mutex const&);

 public:
  _Mutex()
  {
    if (__threads_enabled)
      {
#if !defined __GTHREAD_MUTEX_INIT
        _GTHREAD_MUTEX_INIT_FUNCTION(&_M_mut);
#else
        __gthread_mutex_t __mtemp = __GTHREAD_MUTEX_INIT;
        _M_mut = __mtemp;    <<<<<<<< THIS CAUSES THE ERROR
#endif
      }
  }

I get the following error message from the compiler:
error: no match for 'operator=' in '((__gnu_cxx::_Mutex)this)->__gnu_cxx::_Mutex::_M_Mut = __mtemp'

*/gcc/include/sys/types.h:678: note: candidates are: __pthread_mutex& __pthread_mutex::operator=(const __pthread_mutex&)

The contents of sys/types.h at that location are:
typedef volatile struct __pthread_mutex {
   mutex_t              __pt_mutex_mutex;
   pid_t                __pt_mutex_pid;
   thread_t             __pt_mutex_owner;
   int                  __pt_mutex_depth;
   pthread_mutexattr_t  __pt_mutex_attr;
} pthread_mutex_t;

If I remove the 'volatile' keyword, then everything just works.
So, do I adjust fixincludes to remove the 'volatile' keyword,
or is this some weird side effect of the recent discussions on
volatile (which I didn't read).

Any help / advice appreciated.

Oh PS ... if I change that from a simple assignment to:
__builtin_memcpy((void *)&_M_mut, (const void *)&__mtemp, sizeof(__gthread_mutex_t));
Then it also just works. I could of course adjust the header file
to do that for the platform.

Kean

Reply via email to