Changeset 1477:01b1ddada8ad
- Timestamp:
- 08/29/10 04:37:13 (18 months ago)
- Branch:
- default
- Location:
- sources/src
- Files:
-
- 2 edited
-
pcSyncProcess.cc (modified) (2 diffs)
-
pcSyncThread.cc (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
sources/src/pcSyncProcess.cc
r1464 r1477 225 225 226 226 #ifdef XSI_IPC 227 lock->operations[0].sem_op = -1; 228 227 229 if (microseconds == 0) { 228 lock->operations[0].sem_op = -1;229 230 230 if (semop(lock->keeper, lock->operations, 1) != 0) 231 231 dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 232 232 } else { 233 bool locked = true; 234 unsigned long slept = 0; 235 236 lock->operations[0].sem_op = -1; 237 lock->operations[0].sem_flg = IPC_NOWAIT; 238 239 while (locked) { 240 if (semop(lock->keeper, lock->operations, 1) != 0) { 241 if (errno != EAGAIN) { 242 lock->operations[0].sem_flg = 0; 243 244 dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 245 } 246 247 if (usleep(1) == -1) { 248 lock->operations[0].sem_flg = 0; 249 250 dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 251 } 252 253 slept += 1; 254 255 if (slept > microseconds) { 256 lock->operations[0].sem_flg = 0; 257 258 dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_LIBDODO, PROCESSEX_CANNOTLOCK, PCSYNCPROCESSEX_CANNOTLOCK_STR, __LINE__, __FILE__); 259 } 260 } else { 261 locked = false; 262 } 233 timespec ts = {microseconds/1000000, (microseconds%1000000)*1000}; 234 235 if (semtimedop(lock->keeper, lock->operations, 1, &ts) != 0) { 236 if (errno == EAGAIN) 237 dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_LIBDODO, PROCESSEX_CANNOTLOCK, PCSYNCPROCESSEX_CANNOTLOCK_STR, __LINE__, __FILE__); 238 else 239 dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 263 240 } 264 241 } … … 268 245 dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 269 246 } else { 270 bool locked = true; 271 unsigned long slept = 0; 272 273 while (locked) { 274 if (sem_trywait(lock->keeper) != 0) { 275 if (errno != EAGAIN) 276 dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 277 278 if (usleep(1) == -1) 279 dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 280 281 slept += 1; 282 283 if (slept > microseconds) 284 dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_LIBDODO, PROCESSEX_CANNOTLOCK, PCSYNCPROCESSEX_CANNOTLOCK_STR, __LINE__, __FILE__); 285 } else { 286 locked = false; 287 } 247 timespec ts = {microseconds/1000000, (microseconds%1000000)*1000}; 248 timespec now; 249 250 clock_gettime(CLOCK_REALTIME, &now); 251 ts.tv_sec += now.tv_sec; 252 ts.tv_nsec += now.tv_nsec; 253 if (ts.tv_nsec > 999999999) { 254 ts.tv_sec += 1; 255 ts.tv_nsec -= 999999999; 256 } 257 258 if (sem_timedwait(lock->keeper, &ts) != 0) { 259 if (errno == ETIMEDOUT) 260 dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_LIBDODO, PROCESSEX_CANNOTLOCK, PCSYNCPROCESSEX_CANNOTLOCK_STR, __LINE__, __FILE__); 261 else 262 dodo_throw exception::basic(exception::MODULE_PCSYNCPROCESS, PROCESSEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 288 263 } 289 264 } -
sources/src/pcSyncThread.cc
r1464 r1477 128 128 dodo_throw exception::basic(exception::MODULE_PCSYNCTHREAD, THREADEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 129 129 } else { 130 bool locked = true;131 unsigned long slept = 0;130 timespec ts = {microseconds/1000000, (microseconds%1000000)*1000}; 131 timespec now; 132 132 133 while (locked) { 134 errno = pthread_mutex_trylock(&lock->keeper); 135 if (errno != 0) { 136 if (errno != EBUSY) 137 dodo_throw exception::basic(exception::MODULE_PCSYNCTHREAD, THREADEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 133 clock_gettime(CLOCK_REALTIME, &now); 134 ts.tv_sec += now.tv_sec; 135 ts.tv_nsec += now.tv_nsec; 136 if (ts.tv_nsec > 999999999) { 137 ts.tv_sec += 1; 138 ts.tv_nsec -= 999999999; 139 } 138 140 139 if (usleep(1) == -1) 140 dodo_throw exception::basic(exception::MODULE_PCSYNCTHREAD, THREADEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 141 142 slept += 1; 143 144 if (slept > microseconds) 145 dodo_throw exception::basic(exception::MODULE_PCSYNCTHREAD, THREADEX_ACQUIRE, exception::ERRNO_ERRNO, THREADEX_CANNOTLOCK, PCSYNCTHREADEX_CANNOTLOCK_STR, __LINE__, __FILE__); 146 } else { 147 locked = false; 148 } 141 errno = pthread_mutex_timedlock(&lock->keeper, &ts); 142 if (errno != 0) { 143 if (errno == ETIMEDOUT) 144 dodo_throw exception::basic(exception::MODULE_PCSYNCTHREAD, THREADEX_ACQUIRE, exception::ERRNO_ERRNO, THREADEX_CANNOTLOCK, PCSYNCTHREADEX_CANNOTLOCK_STR, __LINE__, __FILE__); 145 else 146 dodo_throw exception::basic(exception::MODULE_PCSYNCTHREAD, THREADEX_ACQUIRE, exception::ERRNO_ERRNO, errno, strerror(errno), __LINE__, __FILE__); 149 147 } 150 148 }
Note: See TracChangeset
for help on using the changeset viewer.
