On Wed, 19 Feb 2003, Alexander Terekhov wrote:

>   struct pthread_mutex_t_ {
> 
>     /* ... */
> 
> #ifdef __cplusplus
> 
>     __copy_ctor(const pthread_mutex_t_&) {
>       throw "Don't do this!";
>     }
> 
> #endif
> 
>   };
>   typedef struct pthread_mutex_t_ pthread_mutex_t;

I do not know where it is implemented, it is not on my system, this way
but I think what I did should be perfectly legal as I am merely initializing
the class.  In fact having ANY constructor will prevent the statement
"pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER" from working on my
system and probably others which IS legal.  This is because if you have ANY
contractor defined and PTHREAD_MUTEX_INITIALIZER is a macro which uses the
"{...}" form you will get something like this "...must be initialized by
constructor, not by `{...}'.

I have changed the definition to:

#ifdef FAST_MUTEX_INIT_DESTROY
  static const pthread_mutex_t MUTEX_INIT = PTHREAD_MUTEX_INITIALIZER;
#endif

  class Mutex {
    pthread_mutex_t l_;
  private:
    Mutex(const Mutex &);
    void operator=(const Mutex &);
  public:
#ifdef FAST_MUTEX_INIT_DESTROY
    Mutex() : l_(MUTEX_INIT) {}
#else
    Mutex() {pthread_mutex_init(&l_, 0);}
    ~Mutex() {pthread_mutex_destroy($l_);}
#endif
    void lock() {pthread_mutex_lock(&l_);}
    void unlock() {pthread_mutex_unlock(&l_);}
  };

I hope your happy now.  So stupid systems that have pthread_mutex_t 
defined that way will work.

Anyway.  My locking primitives are designed to be on top of any locking 
mechanism, so this is a minor issue.

--- 
http://kevin.atkinson.dhs.org

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to