00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00036 #ifndef _CONCURRENCE_H
00037 #define _CONCURRENCE_H 1
00038 
00039 
00040 #include "bits/gthr.h"
00041 
00042 #if __GTHREADS
00043 
00044 # ifdef __GTHREAD_MUTEX_INIT
00045 #  define __glibcxx_mutex_type __gthread_mutex_t
00046 #  define __glibcxx_mutex_define_initialized(NAME) \
00047 __gthread_mutex_t NAME = __GTHREAD_MUTEX_INIT
00048 #  define __glibcxx_mutex_lock(NAME) \
00049 __gthread_mutex_lock(&NAME)
00050 # else
00051 
00052 struct __glibcxx_mutex : public __gthread_mutex_t
00053 {
00054    __glibcxx_mutex() { __GTHREAD_MUTEX_INIT_FUNCTION(this); }
00055 };
00056 
00057 #  define __glibcxx_mutex_type __glibcxx_mutex
00058 #  define __glibcxx_mutex_define_initialized(NAME) \
00059 __glibcxx_mutex NAME
00060 # define __glibcxx_mutex_lock(NAME) \
00061 __gthread_mutex_lock(&NAME)
00062 # endif
00063 
00064 # define __glibcxx_mutex_unlock(NAME) __gthread_mutex_unlock(&NAME)
00065 
00066 #else
00067 
00068 # define __glibcxx_mutex_type __gthread_mutex_t
00069 # define __glibcxx_mutex_define_initialized(NAME) __gthread_mutex_t NAME
00070 # define __glibcxx_mutex_lock(NAME)
00071 # define __glibcxx_mutex_unlock(NAME)
00072 
00073 #endif
00074 
00075 namespace __gnu_cxx
00076 {
00077   typedef __glibcxx_mutex_type mutex_type;
00078   
00080   
00081   
00082   class lock
00083   {
00084     
00085     mutex_type& device;
00086 
00087   public:
00088     explicit lock(mutex_type& name) : device(name)
00089     { __glibcxx_mutex_lock(device); }
00090 
00091     ~lock() throw()
00092     { __glibcxx_mutex_unlock(device); }
00093 
00094   private:
00095     lock(const lock&);
00096     lock& operator=(const lock&);
00097   };
00098 }
00099 
00100 #endif