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
00032
00033
00034
00035
00036 #define __USE_GNU
00037 #include <pthread.h>
00038 #include <time.h>
00039
00040 #include <stdnet/system/platform/posix/NativeLock>
00041
00042 namespace stdbase {
00043 namespace system {
00044 namespace platform {
00045
00046 Lock::
00047 Lock()
00048 : mutex(),
00049 condition()
00050 {
00051 pthread_mutex_init( & mutex, NULL );
00052 pthread_cond_init( & condition, NULL );
00053 locked = false;
00054 }
00055
00056 Lock::
00057 ~Lock()
00058 {
00059 pthread_cond_destroy( & condition );
00060 pthread_mutex_destroy( & mutex );
00061 }
00062
00063 void Lock::
00064 seize()
00065 {
00066 int val = pthread_mutex_lock( & mutex );
00067 locked = true;
00068 }
00069
00070 bool Lock::
00071 trySeize()
00072 {
00073 int val = pthread_mutex_trylock( & mutex );
00074 return val == 0;
00075 }
00076
00077 void Lock::
00078 release()
00079 {
00080 int val;
00081
00082 locked = false;
00083 val = pthread_mutex_unlock( & mutex );
00084 }
00085
00086 void Lock::
00087 waitSignal()
00088 {
00089 int result = pthread_cond_wait( & condition, &mutex );
00090 }
00091
00092 bool Lock::
00093 timedWaitSignal( int millisec )
00094 {
00095 bool retval;
00096 int result;
00097 struct timespec stop_time;
00098
00099 stop_time.tv_sec = time( NULL ) + (millisec / 1000);
00100 stop_time.tv_nsec = (millisec % 1000) * 1000;
00101
00102 result = pthread_cond_timedwait( &condition, &mutex, &stop_time);
00103 return retval == 0;
00104 }
00105
00106 void Lock::
00107 signal()
00108 {
00109 int result;
00110 result = pthread_cond_signal( & condition );
00111 }
00112
00113 void Lock::
00114 signalAll()
00115 {
00116 int result;
00117 result = pthread_cond_broadcast( & condition );
00118 }
00119
00120 }
00121 }
00122 }
00123