00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include <os.h>
00017 #include <Mutex.h>
00018 #include <Debug.h>
00019 #include <NanoTimer.h>
00020 #include <Config.h>
00021 #include <Process.h>
00022 Mutex::Mutex()
00023 {
00024 #if defined(sparc) || defined(i686)
00025 lock =0;
00026 #else
00027 pthread_mutexattr_t attr;
00028 pthread_mutexattr_init(&attr);
00029 pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
00030 pthread_mutex_init(&mutex_, &attr);
00031 #endif
00032 }
00033
00034 int Mutex::init()
00035 {
00036 #if defined(sparc) || defined(i686)
00037 lock = 0;
00038 #else
00039 pthread_mutexattr_t attr;
00040 pthread_mutexattr_init(&attr);
00041 int ret = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
00042 printf("pthread_mutexattr_setpshared Returned %d\n", ret);
00043 pthread_mutex_init(&mutex_, &attr);
00044 pthread_mutexattr_destroy(&attr);
00045 #endif
00046 return 0;
00047 }
00048 int Mutex::init(char *mname)
00049 {
00050 if (strlen(mname) > 19 ) return 0;
00051 init();
00052 strcpy(name, mname);
00053 return 0;
00054
00055 }
00056
00057 #if defined(sparc) || defined(i686)
00058 int TSL(Lock *lock)
00059 {
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 #if defined(i686)
00084 int* lw;
00085 int res;
00086 lw = (int*)lock;
00087 if (*lock == 1) return 1;
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 __asm__ __volatile__(
00111 "xchgl %0, %1 \n\t"
00112 : "=r"(res), "=m"(*lock)
00113 : "0"(1), "m"(*lock)
00114 : "memory");
00115
00116
00117
00118 return(res);
00119
00120 #elif defined (sparc)
00121 Lock res;
00122 __asm__ __volatile__("ldstub [%2], %0 \n"
00123 "=r"(res), "+m"(*lock)
00124 "r"(lock)
00125 "memory");
00126 return (int) res;
00127 #endif
00128 }
00129 #endif
00130
00131 int Mutex::tryLock(int tryTimes, int waitmsecs)
00132 {
00133 int tries = 0;
00134 int ret = 0;
00135 struct timeval timeout;
00136 timeout.tv_sec = 0;
00137 timeout.tv_usec = waitmsecs;
00138 if (tryTimes == 0 && waitmsecs == 0)
00139 {
00140 timeout.tv_sec = Conf::config.getMutexSecs();
00141 timeout.tv_usec = Conf::config.getMutexUSecs();
00142 tryTimes = Conf::config.getMutexRetries();
00143 }
00144 while (tries < tryTimes)
00145 {
00146 #if defined(sparc) || defined(i686)
00147 if (TSL(&lock) == 0)
00148 {
00149 return 0;
00150 }
00151 #else
00152 ret = pthread_mutex_trylock(&mutex_);
00153 if (EBUSY != ret) return 0;
00154
00155 #endif
00156 os::select(0, 0, 0, 0, &timeout);
00157 tries++;
00158 }
00159 printError(ErrLockTimeOut, "Unable to get the mutex , tried %d times", tries);
00160 return 1;
00161 }
00162
00163
00164 int Mutex::getLock(int procSlot, bool procAccount)
00165 {
00166 int ret=0;
00167 #if defined(sparc) || defined(i686)
00168 ret = tryLock();
00169
00170 if (ret ==0 && procAccount) ProcessManager::addMutex(this, procSlot);
00171
00172 return ret;
00173 #else
00174 ret = pthread_mutex_lock(&mutex_);
00175 #endif
00176 if (ret == 0) return 0;
00177 else
00178 return 1;
00179 }
00180
00181 int Mutex::releaseLock(int procSlot, bool procAccount)
00182 {
00183 int ret=0;
00184 #if defined(sparc) || defined(i686)
00185
00186
00187
00188
00189
00190
00191
00192 lock = 0;
00193 #else
00194 ret = pthread_mutex_unlock(&mutex_);
00195 #endif
00196 if (ret == 0 && procAccount)
00197 {
00198 ProcessManager::removeMutex(this, procSlot);
00199 return ret;
00200 }
00201 else
00202 return 1;
00203 }
00204
00205 int Mutex::destroy()
00206 {
00207 #if defined(sparc) || defined(i686)
00208 #else
00209 return pthread_mutex_destroy(&mutex_);
00210 #endif
00211 return 0;
00212 }