Changeset 32946 in vbox for trunk/src/VBox/Runtime/r3/linux
- Timestamp:
- Oct 6, 2010 2:21:29 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 66441
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/r3/linux/semeventmulti-linux.cpp
r28800 r32946 5 5 6 6 /* 7 * Copyright (C) 2006-20 07Oracle Corporation7 * Copyright (C) 2006-2010 Oracle Corporation 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 248 248 249 249 250 static int rtSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, RTMSINTERVAL cMillies, bool fAutoResume) 251 { 252 PCRTLOCKVALSRCPOS pSrcPos = NULL;253 250 251 DECLINLINE(int) rtSemEventLnxMultiWait(struct RTSEMEVENTMULTIINTERNAL *pThis, uint32_t fFlags, uint64_t uTimeout, 252 PCRTLOCKVALSRCPOS pSrcPos) 253 { 254 254 /* 255 255 * Validate input. 256 256 */ 257 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem;258 AssertReturn( VALID_PTR(pThis) && pThis->u32Magic == RTSEMEVENTMULTI_MAGIC,259 VERR_INVALID_HANDLE);257 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 258 AssertReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, VERR_INVALID_HANDLE); 259 AssertReturn(RTSEMWAIT_FLAGS_ARE_VALID(fFlags), VERR_INVALID_PARAMETER); 260 260 261 261 /* … … 268 268 269 269 /* 270 * C onvert the timeout value.270 * Check and convert the timeout value. 271 271 */ 272 272 struct timespec ts; 273 273 struct timespec *pTimeout = NULL; 274 uint64_t u64 End= 0; /* shut up gcc */275 if ( cMillies != RT_INDEFINITE_WAIT)274 uint64_t u64Deadline = 0; /* shut up gcc */ 275 if (!(fFlags & RTSEMWAIT_FLAGS_INDEFINITE)) 276 276 { 277 277 /* If the timeout is zero, then we're done. */ 278 if (! cMillies)278 if (!uTimeout) 279 279 return VERR_TIMEOUT; 280 ts.tv_sec = cMillies / 1000; 281 ts.tv_nsec = (cMillies % 1000) * UINT32_C(1000000); 282 u64End = RTTimeSystemNanoTS() + cMillies * UINT64_C(1000000); 283 pTimeout = &ts; 280 281 /* Convert it to a deadline + interval timespec. */ 282 if (fFlags & RTSEMWAIT_FLAGS_MILLISECS) 283 uTimeout = uTimeout < UINT64_MAX / UINT32_C(1000000) * UINT32_C(1000000) 284 ? uTimeout * UINT32_C(1000000) 285 : UINT64_MAX; 286 if (uTimeout != UINT64_MAX) /* unofficial way of indicating an indefinite wait */ 287 { 288 if (fFlags & RTSEMWAIT_FLAGS_RELATIVE) 289 u64Deadline = RTTimeSystemNanoTS(); 290 else 291 { 292 uint64_t u64Now = RTTimeSystemNanoTS(); 293 if (uTimeout <= u64Now) 294 return VERR_TIMEOUT; 295 u64Deadline = uTimeout; 296 uTimeout -= u64Now; 297 } 298 if ( sizeof(ts.tv_sec) >= sizeof(uint64_t) 299 || uTimeout <= UINT64_C(1000000000) * UINT32_MAX) 300 { 301 ts.tv_nsec = uTimeout % UINT32_C(1000000000); 302 ts.tv_sec = uTimeout / UINT32_C(1000000000); 303 pTimeout = &ts; 304 } 305 } 284 306 } 285 307 … … 306 328 if (pTimeout) 307 329 { 308 int64_t i64Diff = u64 End- RTTimeSystemNanoTS();330 int64_t i64Diff = u64Deadline - RTTimeSystemNanoTS(); 309 331 if (i64Diff < 1000) 310 332 return VERR_TIMEOUT; … … 316 338 { 317 339 int rc9 = RTLockValidatorRecSharedCheckBlocking(&pThis->Signallers, hThreadSelf, pSrcPos, false, 318 cMillies, RTTHREADSTATE_EVENT_MULTI, true);340 uTimeout / UINT32_C(1000000), RTTHREADSTATE_EVENT_MULTI, true); 319 341 if (RT_FAILURE(rc9)) 320 342 return rc9; … … 344 366 else if (rc == -EINTR) 345 367 { 346 if ( !fAutoResume)368 if (fFlags & RTSEMWAIT_FLAGS_NORESUME) 347 369 return VERR_INTERRUPTED; 348 370 } … … 360 382 361 383 362 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, RTMSINTERVAL cMillies) 363 { 364 int rc = rtSemEventMultiWait(hEventMultiSem, cMillies, true); 365 Assert(rc != VERR_INTERRUPTED); 366 return rc; 367 } 368 369 370 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, RTMSINTERVAL cMillies) 371 { 372 return rtSemEventMultiWait(hEventMultiSem, cMillies, false); 384 #undef RTSemEventMultiWaitEx 385 RTDECL(int) RTSemEventMultiWaitEx(RTSEMEVENTMULTI hEventMultiSem, uint32_t fFlags, uint64_t uTimeout) 386 { 387 #ifndef RTSEMEVENT_STRICT 388 return rtSemEventLnxMultiWait(hEventMultiSem, fFlags, uTimeout, NULL); 389 #else 390 RTLOCKVALSRCPOS SrcPos = RTLOCKVALSRCPOS_INIT_NORMAL_API(); 391 return rtSemEventLnxMultiWait(hEventMultiSem, fFlags, uTimeout, &SrcPos); 392 #endif 393 } 394 395 396 RTDECL(int) RTSemEventMultiWaitExDebug(RTSEMEVENTMULTI hEventMultiSem, uint32_t fFlags, uint64_t uTimeout, 397 RTHCUINTPTR uId, RT_SRC_POS_DECL) 398 { 399 RTLOCKVALSRCPOS SrcPos = RTLOCKVALSRCPOS_INIT_DEBUG_API(); 400 return rtSemEventLnxMultiWait(hEventMultiSem, fFlags, uTimeout, &SrcPos); 373 401 } 374 402 … … 411 439 } 412 440 441 #include "../../generic/RTSemEventMultiWait-2-ex-generic.cpp" 442 #include "../../generic/RTSemEventMultiWaitNoResume-2-ex-generic.cpp" 443 413 444 #endif /* glibc < 2.6 || IPRT_WITH_FUTEX_BASED_SEMS */ 414 445
Note:
See TracChangeset
for help on using the changeset viewer.