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
00031 #ifndef _CONCURRENCE_H
00032 #define _CONCURRENCE_H 1
00033
00034
00035 #include "bits/gthr.h"
00036
00037 #if __GTHREADS
00038
00039 # ifdef __GTHREAD_MUTEX_INIT
00040 # define __glibcxx_mutex_type __gthread_mutex_t
00041 # define __glibcxx_mutex_define_initialized(NAME) \
00042 __gthread_mutex_t NAME = __GTHREAD_MUTEX_INIT
00043 # define __glibcxx_mutex_lock(NAME) \
00044 __gthread_mutex_lock(&NAME)
00045 # else
00046
00047 struct __glibcxx_mutex : public __gthread_mutex_t
00048 {
00049 __glibcxx_mutex() { __GTHREAD_MUTEX_INIT_FUNCTION(this); }
00050 };
00051
00052 # define __glibcxx_mutex_type __glibcxx_mutex
00053 # define __glibcxx_mutex_define_initialized(NAME) \
00054 __glibcxx_mutex NAME
00055 # define __glibcxx_mutex_lock(NAME) \
00056 __gthread_mutex_lock(&NAME)
00057 # endif
00058
00059 # define __glibcxx_mutex_unlock(NAME) __gthread_mutex_unlock(&NAME)
00060
00061 #else
00062
00063 # define __glibcxx_mutex_type __gthread_mutex_t
00064 # define __glibcxx_mutex_define_initialized(NAME) __gthread_mutex_t NAME
00065 # define __glibcxx_mutex_lock(NAME)
00066 # define __glibcxx_mutex_unlock(NAME)
00067
00068 #endif
00069
00070 namespace __gnu_cxx
00071 {
00072 typedef __glibcxx_mutex_type mutex_type;
00073
00074
00075
00076
00077 class lock
00078 {
00079
00080 mutex_type& device;
00081
00082 public:
00083 explicit lock(mutex_type& name) : device(name)
00084 { __glibcxx_mutex_lock(device); }
00085
00086 ~lock() throw()
00087 { __glibcxx_mutex_unlock(device); }
00088
00089 private:
00090 lock(const lock&);
00091 lock& operator=(const lock&);
00092 };
00093 }
00094
00095 #endif