Changeset 25720 in vbox
- Timestamp:
- Jan 11, 2010 1:57:09 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 56460
- Location:
- trunk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/iprt/semaphore.h
r25717 r25720 59 59 60 60 /** 61 * Create a event semaphore.61 * Create an event semaphore. 62 62 * 63 63 * @returns iprt status code. … … 68 68 69 69 /** 70 * Create s a read/writesemaphore.70 * Create an event semaphore. 71 71 * 72 72 * @returns iprt status code. … … 91 91 /** @} */ 92 92 93 94 93 /** 95 94 * Destroy an event semaphore. … … 183 182 184 183 /** 185 * Create a event multi semaphore. 186 * 187 * @returns iprt status code. 188 * @param pEventMultiSem Where to store the event multi semaphore handle. 189 */ 190 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem); 184 * Creates a multiple release event semaphore. 185 * 186 * @returns iprt status code. 187 * @param phEventMultiSem Where to store the handle to the newly created 188 * multiple release event semaphore. 189 */ 190 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem); 191 192 /** 193 * Creates a multiple release event semaphore. 194 * 195 * @returns iprt status code. 196 * @param phEventMultiSem Where to store the handle to the newly created 197 * multiple release event semaphore. 198 * @param fFlags Flags, any combination of the 199 * RTSEMEVENTMULTI_FLAGS_XXX \#defines. 200 * @param hClass The class (no reference consumed). Since we 201 * don't do order checks on event semaphores, the 202 * use of the class is limited to controlling the 203 * timeout threshold for deadlock detection. 204 * @param pszNameFmt Name format string for the lock validator, 205 * optional (NULL). Max length is 32 bytes. 206 * @param ... Format string arguments. 207 */ 208 RTDECL(int) RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass, 209 const char *pszNameFmt, ...); 210 211 /** @name RTSemMutexCreateEx flags 212 * @{ */ 213 /** Disables lock validation. */ 214 #define RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL UINT32_C(0x00000001) 215 /** @} */ 191 216 192 217 /** … … 194 219 * 195 220 * @returns iprt status code. 196 * @param EventMultiSem The event multi sempahore to destroy. 197 */ 198 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem); 221 * @param hEventMultiSem The multiple release event sempahore. NIL is 222 * quietly ignored (VINF_SUCCESS). 223 */ 224 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem); 199 225 200 226 /** … … 202 228 * 203 229 * @returns iprt status code. 204 * @param EventMultiSem The event multi semaphore to signal.205 */ 206 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem);230 * @param hEventMultiSem The multiple release event sempahore. 231 */ 232 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem); 207 233 208 234 /** … … 210 236 * 211 237 * @returns iprt status code. 212 * @param EventMultiSem The event multi semaphore to reset.213 */ 214 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem);238 * @param hEventMultiSem The multiple release event sempahore. 239 */ 240 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem); 215 241 216 242 /** … … 222 248 * @returns iprt status code. 223 249 * Will not return VERR_INTERRUPTED. 224 * @param EventMultiSem The event multi semaphore to wait on.225 * @param cMillies Number of milliseconds to wait.226 */ 227 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies);250 * @param hEventMultiSem The multiple release event sempahore. 251 * @param cMillies Number of milliseconds to wait. 252 */ 253 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies); 228 254 229 255 … … 234 260 * 235 261 * @returns iprt status code. 236 * @param EventMultiSem The event multi semaphore to wait on.237 * @param cMillies Number of milliseconds to wait.238 */ 239 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies);262 * @param hEventMultiSem The multiple release event sempahore. 263 * @param cMillies Number of milliseconds to wait. 264 */ 265 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies); 240 266 241 267 /** -
trunk/src/VBox/Runtime/r0drv/darwin/semaphore-r0drv-darwin.cpp
r25717 r25720 219 219 PRTSEMEVENTINTERNAL pThis = (PRTSEMEVENTINTERNAL)hEventSem; 220 220 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 221 AssertMsgReturn(pThis->u32Magic == RTSEMEVENT_MAGIC, 222 ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), 223 VERR_INVALID_HANDLE); 221 AssertMsgReturn(pThis->u32Magic == RTSEMEVENT_MAGIC, ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE); 224 222 if (cMillies) 225 223 RT_ASSERT_PREEMPTIBLE(); … … 320 318 321 319 322 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem) 323 { 324 Assert(sizeof(RTSEMEVENTMULTIINTERNAL) > sizeof(void *)); 325 AssertPtrReturn(pEventMultiSem, VERR_INVALID_POINTER); 320 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem) 321 { 322 return RTSemEventMultiCreateEx(phEventMultiSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, NULL); 323 } 324 325 326 RTDECL(int) RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass, 327 const char *pszNameFmt, ...) 328 { 329 AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER); 330 AssertCompile(sizeof(RTSEMEVENTMULTIINTERNAL) > sizeof(void *)); 331 AssertPtrReturn(phEventMultiSem, VERR_INVALID_POINTER); 326 332 RT_ASSERT_PREEMPTIBLE(); 327 333 328 PRTSEMEVENTMULTIINTERNAL p EventMultiInt = (PRTSEMEVENTMULTIINTERNAL)RTMemAlloc(sizeof(*pEventMultiInt));329 if (p EventMultiInt)330 { 331 p EventMultiInt->u32Magic = RTSEMEVENTMULTI_MAGIC;332 p EventMultiInt->cWaiters = 0;333 p EventMultiInt->cWaking = 0;334 p EventMultiInt->fSignaled = 0;334 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)RTMemAlloc(sizeof(*pThis)); 335 if (pThis) 336 { 337 pThis->u32Magic = RTSEMEVENTMULTI_MAGIC; 338 pThis->cWaiters = 0; 339 pThis->cWaking = 0; 340 pThis->fSignaled = 0; 335 341 Assert(g_pDarwinLockGroup); 336 p EventMultiInt->pSpinlock = lck_spin_alloc_init(g_pDarwinLockGroup, LCK_ATTR_NULL);337 if (p EventMultiInt->pSpinlock)342 pThis->pSpinlock = lck_spin_alloc_init(g_pDarwinLockGroup, LCK_ATTR_NULL); 343 if (pThis->pSpinlock) 338 344 { 339 *p EventMultiSem = pEventMultiInt;345 *phEventMultiSem = pThis; 340 346 return VINF_SUCCESS; 341 347 } 342 348 343 p EventMultiInt->u32Magic = 0;344 RTMemFree(p EventMultiInt);349 pThis->u32Magic = 0; 350 RTMemFree(pThis); 345 351 } 346 352 return VERR_NO_MEMORY; … … 348 354 349 355 350 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem) 351 { 352 if (EventMultiSem == NIL_RTSEMEVENTMULTI) /* don't bitch */ 353 return VERR_INVALID_HANDLE; 354 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem; 355 AssertPtrReturn(pEventMultiInt, VERR_INVALID_HANDLE); 356 AssertMsgReturn(pEventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC, 357 ("pEventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic), 358 VERR_INVALID_HANDLE); 356 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem) 357 { 358 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 359 if (pThis == NIL_RTSEMEVENTMULTI) 360 return VINF_SUCCESS; 361 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 362 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE); 359 363 RT_ASSERT_INTS_ON(); 360 364 361 lck_spin_lock(p EventMultiInt->pSpinlock);362 ASMAtomicIncU32(&p EventMultiInt->u32Magic); /* make the handle invalid */363 if (p EventMultiInt->cWaiters > 0)365 lck_spin_lock(pThis->pSpinlock); 366 ASMAtomicIncU32(&pThis->u32Magic); /* make the handle invalid */ 367 if (pThis->cWaiters > 0) 364 368 { 365 369 /* abort waiting thread, last man cleans up. */ 366 ASMAtomicXchgU32(&p EventMultiInt->cWaking, pEventMultiInt->cWaking + pEventMultiInt->cWaiters);367 thread_wakeup_prim((event_t)p EventMultiInt, FALSE /* all threads */, THREAD_RESTART);368 lck_spin_unlock(p EventMultiInt->pSpinlock);369 } 370 else if (p EventMultiInt->cWaking)370 ASMAtomicXchgU32(&pThis->cWaking, pThis->cWaking + pThis->cWaiters); 371 thread_wakeup_prim((event_t)pThis, FALSE /* all threads */, THREAD_RESTART); 372 lck_spin_unlock(pThis->pSpinlock); 373 } 374 else if (pThis->cWaking) 371 375 /* the last waking thread is gonna do the cleanup */ 372 lck_spin_unlock(p EventMultiInt->pSpinlock);376 lck_spin_unlock(pThis->pSpinlock); 373 377 else 374 378 { 375 lck_spin_unlock(pEventMultiInt->pSpinlock); 376 lck_spin_destroy(pEventMultiInt->pSpinlock, g_pDarwinLockGroup); 377 RTMemFree(pEventMultiInt); 378 } 379 380 return VINF_SUCCESS; 381 } 382 383 384 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem) 385 { 386 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem; 387 AssertPtrReturn(pEventMultiInt, VERR_INVALID_HANDLE); 388 AssertMsgReturn(pEventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC, 389 ("pEventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic), 390 VERR_INVALID_HANDLE); 379 lck_spin_unlock(pThis->pSpinlock); 380 lck_spin_destroy(pThis->pSpinlock, g_pDarwinLockGroup); 381 RTMemFree(pThis); 382 } 383 384 return VINF_SUCCESS; 385 } 386 387 388 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem) 389 { 390 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 391 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 392 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE); 391 393 RT_ASSERT_PREEMPT_CPUID_VAR(); 392 394 RT_ASSERT_INTS_ON(); 393 395 394 lck_spin_lock(p EventMultiInt->pSpinlock);395 396 ASMAtomicXchgU8(&p EventMultiInt->fSignaled, true);397 if (p EventMultiInt->cWaiters > 0)398 { 399 ASMAtomicXchgU32(&p EventMultiInt->cWaking, pEventMultiInt->cWaking + pEventMultiInt->cWaiters);400 ASMAtomicXchgU32(&p EventMultiInt->cWaiters, 0);401 thread_wakeup_prim((event_t)p EventMultiInt, FALSE /* all threads */, THREAD_AWAKENED);402 } 403 404 lck_spin_unlock(p EventMultiInt->pSpinlock);396 lck_spin_lock(pThis->pSpinlock); 397 398 ASMAtomicXchgU8(&pThis->fSignaled, true); 399 if (pThis->cWaiters > 0) 400 { 401 ASMAtomicXchgU32(&pThis->cWaking, pThis->cWaking + pThis->cWaiters); 402 ASMAtomicXchgU32(&pThis->cWaiters, 0); 403 thread_wakeup_prim((event_t)pThis, FALSE /* all threads */, THREAD_AWAKENED); 404 } 405 406 lck_spin_unlock(pThis->pSpinlock); 405 407 406 408 RT_ASSERT_PREEMPT_CPUID(); … … 409 411 410 412 411 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem) 412 { 413 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem; 414 AssertPtrReturn(pEventMultiInt, VERR_INVALID_HANDLE); 415 AssertMsgReturn(pEventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC, 416 ("pEventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic), 417 VERR_INVALID_HANDLE); 413 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem) 414 { 415 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 416 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 417 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE); 418 418 RT_ASSERT_PREEMPT_CPUID_VAR(); 419 419 RT_ASSERT_INTS_ON(); 420 420 421 lck_spin_lock(p EventMultiInt->pSpinlock);422 ASMAtomicXchgU8(&p EventMultiInt->fSignaled, false);423 lck_spin_unlock(p EventMultiInt->pSpinlock);421 lck_spin_lock(pThis->pSpinlock); 422 ASMAtomicXchgU8(&pThis->fSignaled, false); 423 lck_spin_unlock(pThis->pSpinlock); 424 424 425 425 RT_ASSERT_PREEMPT_CPUID(); … … 428 428 429 429 430 static int rtSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies, wait_interrupt_t fInterruptible) 431 { 432 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem; 433 AssertPtrReturn(pEventMultiInt, VERR_INVALID_HANDLE); 434 AssertMsgReturn(pEventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC, 435 ("pEventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic), 436 VERR_INVALID_HANDLE); 430 static int rtSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies, wait_interrupt_t fInterruptible) 431 { 432 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 433 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 434 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE); 437 435 if (cMillies) 438 436 RT_ASSERT_PREEMPTIBLE(); 439 437 440 lck_spin_lock(p EventMultiInt->pSpinlock);438 lck_spin_lock(pThis->pSpinlock); 441 439 442 440 int rc; 443 if (p EventMultiInt->fSignaled)441 if (pThis->fSignaled) 444 442 rc = VINF_SUCCESS; 445 443 else if (!cMillies) … … 447 445 else 448 446 { 449 ASMAtomicIncU32(&p EventMultiInt->cWaiters);447 ASMAtomicIncU32(&pThis->cWaiters); 450 448 451 449 wait_result_t rcWait; 452 450 if (cMillies == RT_INDEFINITE_WAIT) 453 rcWait = lck_spin_sleep(p EventMultiInt->pSpinlock, LCK_SLEEP_DEFAULT, (event_t)pEventMultiInt, fInterruptible);451 rcWait = lck_spin_sleep(pThis->pSpinlock, LCK_SLEEP_DEFAULT, (event_t)pThis, fInterruptible); 454 452 else 455 453 { … … 458 456 u64AbsTime += mach_absolute_time(); 459 457 460 rcWait = lck_spin_sleep_deadline(p EventMultiInt->pSpinlock, LCK_SLEEP_DEFAULT,461 (event_t)p EventMultiInt, fInterruptible, u64AbsTime);458 rcWait = lck_spin_sleep_deadline(pThis->pSpinlock, LCK_SLEEP_DEFAULT, 459 (event_t)pThis, fInterruptible, u64AbsTime); 462 460 } 463 461 switch (rcWait) 464 462 { 465 463 case THREAD_AWAKENED: 466 Assert(p EventMultiInt->cWaking > 0);467 if ( !ASMAtomicDecU32(&p EventMultiInt->cWaking)468 && p EventMultiInt->u32Magic != RTSEMEVENTMULTI_MAGIC)464 Assert(pThis->cWaking > 0); 465 if ( !ASMAtomicDecU32(&pThis->cWaking) 466 && pThis->u32Magic != RTSEMEVENTMULTI_MAGIC) 469 467 { 470 468 /* the event was destroyed after we woke up, as the last thread do the cleanup. */ 471 lck_spin_unlock(p EventMultiInt->pSpinlock);469 lck_spin_unlock(pThis->pSpinlock); 472 470 Assert(g_pDarwinLockGroup); 473 lck_spin_destroy(p EventMultiInt->pSpinlock, g_pDarwinLockGroup);474 RTMemFree(p EventMultiInt);471 lck_spin_destroy(pThis->pSpinlock, g_pDarwinLockGroup); 472 RTMemFree(pThis); 475 473 return VINF_SUCCESS; 476 474 } … … 480 478 case THREAD_TIMED_OUT: 481 479 Assert(cMillies != RT_INDEFINITE_WAIT); 482 ASMAtomicDecU32(&p EventMultiInt->cWaiters);480 ASMAtomicDecU32(&pThis->cWaiters); 483 481 rc = VERR_TIMEOUT; 484 482 break; … … 486 484 case THREAD_INTERRUPTED: 487 485 Assert(fInterruptible); 488 ASMAtomicDecU32(&p EventMultiInt->cWaiters);486 ASMAtomicDecU32(&pThis->cWaiters); 489 487 rc = VERR_INTERRUPTED; 490 488 break; … … 492 490 case THREAD_RESTART: 493 491 /* Last one out does the cleanup. */ 494 if (!ASMAtomicDecU32(&p EventMultiInt->cWaking))492 if (!ASMAtomicDecU32(&pThis->cWaking)) 495 493 { 496 lck_spin_unlock(p EventMultiInt->pSpinlock);494 lck_spin_unlock(pThis->pSpinlock); 497 495 Assert(g_pDarwinLockGroup); 498 lck_spin_destroy(p EventMultiInt->pSpinlock, g_pDarwinLockGroup);499 RTMemFree(p EventMultiInt);496 lck_spin_destroy(pThis->pSpinlock, g_pDarwinLockGroup); 497 RTMemFree(pThis); 500 498 return VERR_SEM_DESTROYED; 501 499 } … … 511 509 } 512 510 513 lck_spin_unlock(p EventMultiInt->pSpinlock);511 lck_spin_unlock(pThis->pSpinlock); 514 512 return rc; 515 513 } 516 514 517 515 518 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)519 { 520 return rtSemEventMultiWait( EventMultiSem, cMillies, THREAD_UNINT);521 } 522 523 524 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)525 { 526 return rtSemEventMultiWait( EventMultiSem, cMillies, THREAD_ABORTSAFE);516 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 517 { 518 return rtSemEventMultiWait(hEventMultiSem, cMillies, THREAD_UNINT); 519 } 520 521 522 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 523 { 524 return rtSemEventMultiWait(hEventMultiSem, cMillies, THREAD_ABORTSAFE); 527 525 } 528 526 … … 536 534 RT_ASSERT_PREEMPTIBLE(); 537 535 AssertCompile(sizeof(RTSEMMUTEXINTERNAL) > sizeof(void *)); 538 PRTSEMMUTEXINTERNAL p MutexInt = (PRTSEMMUTEXINTERNAL)RTMemAlloc(sizeof(*pMutexInt));539 if (p MutexInt)540 { 541 p MutexInt->u32Magic = RTSEMMUTEX_MAGIC;536 PRTSEMMUTEXINTERNAL pThis = (PRTSEMMUTEXINTERNAL)RTMemAlloc(sizeof(*pThis)); 537 if (pThis) 538 { 539 pThis->u32Magic = RTSEMMUTEX_MAGIC; 542 540 Assert(g_pDarwinLockGroup); 543 p MutexInt->pMtx = lck_mtx_alloc_init(g_pDarwinLockGroup, LCK_ATTR_NULL);544 if (p MutexInt->pMtx)541 pThis->pMtx = lck_mtx_alloc_init(g_pDarwinLockGroup, LCK_ATTR_NULL); 542 if (pThis->pMtx) 545 543 { 546 *pMutexSem = p MutexInt;544 *pMutexSem = pThis; 547 545 return VINF_SUCCESS; 548 546 } 549 RTMemFree(p MutexInt);547 RTMemFree(pThis); 550 548 } 551 549 return VERR_NO_MEMORY; … … 558 556 * Validate input. 559 557 */ 560 PRTSEMMUTEXINTERNAL p MutexInt= (PRTSEMMUTEXINTERNAL)MutexSem;561 if (!p MutexInt)558 PRTSEMMUTEXINTERNAL pThis = (PRTSEMMUTEXINTERNAL)MutexSem; 559 if (!pThis) 562 560 return VERR_INVALID_PARAMETER; 563 AssertPtrReturn(pMutexInt, VERR_INVALID_POINTER); 564 AssertMsg(pMutexInt->u32Magic == RTSEMMUTEX_MAGIC, 565 ("pMutexInt->u32Magic=%RX32 pMutexInt=%p\n", pMutexInt->u32Magic, pMutexInt) 566 VERR_INVALID_PARAMETER); 561 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 562 AssertMsg(pThis->u32Magic == RTSEMMUTEX_MAGIC, ("u32Magic=%RX32 pThis=%p\n", pThis->u32Magic, pThis), VERR_INVALID_HANDLE); 567 563 RT_ASSERT_INTS_ON(); 568 564 … … 570 566 * Invalidate it and signal the object just in case. 571 567 */ 572 ASMAtomicIncU32(&p MutexInt->u32Magic);568 ASMAtomicIncU32(&pThis->u32Magic); 573 569 574 570 Assert(g_pDarwinLockGroup); 575 lck_mtx_free(p MutexInt->pMtx, g_pDarwinLockGroup);576 p MutexInt->pMtx = NULL;577 578 RTMemFree(p MutexInt);571 lck_mtx_free(pThis->pMtx, g_pDarwinLockGroup); 572 pThis->pMtx = NULL; 573 574 RTMemFree(pThis); 579 575 return VINF_SUCCESS; 580 576 } … … 586 582 * Validate input. 587 583 */ 588 PRTSEMMUTEXINTERNAL p MutexInt= (PRTSEMMUTEXINTERNAL)MutexSem;589 if (!p MutexInt)584 PRTSEMMUTEXINTERNAL pThis = (PRTSEMMUTEXINTERNAL)MutexSem; 585 if (!pThis) 590 586 return VERR_INVALID_PARAMETER; 591 AssertPtrReturn(pMutexInt, VERR_INVALID_POINTER); 592 AssertMsg(pMutexInt->u32Magic == RTSEMMUTEX_MAGIC, 593 ("pMutexInt->u32Magic=%RX32 pMutexInt=%p\n", pMutexInt->u32Magic, pMutexInt) 594 VERR_INVALID_PARAMETER); 587 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 588 AssertMsg(pThis->u32Magic == RTSEMMUTEX_MAGIC, ("u32Magic=%RX32 pThis=%p\n", pThis->u32Magic, pThis), VERR_INVALID_HANDLE); 595 589 if (cMillies) 596 590 RT_ASSERT_PREEMPTIBLE(); … … 604 598 NTSTATUS rcNt; 605 599 if (cMillies == RT_INDEFINITE_WAIT) 606 rcNt = KeWaitForSingleObject(&p MutexInt->Mutex, Executive, KernelMode, TRUE, NULL);600 rcNt = KeWaitForSingleObject(&pThis->Mutex, Executive, KernelMode, TRUE, NULL); 607 601 else 608 602 { 609 603 LARGE_INTEGER Timeout; 610 604 Timeout.QuadPart = -(int64_t)cMillies * 10000; 611 rcNt = KeWaitForSingleObject(&p MutexInt->Mutex, Executive, KernelMode, TRUE, &Timeout);605 rcNt = KeWaitForSingleObject(&pThis->Mutex, Executive, KernelMode, TRUE, &Timeout); 612 606 } 613 607 switch (rcNt) 614 608 { 615 609 case STATUS_SUCCESS: 616 if (p MutexInt->u32Magic == RTSEMMUTEX_MAGIC)610 if (pThis->u32Magic == RTSEMMUTEX_MAGIC) 617 611 return VINF_SUCCESS; 618 612 return VERR_SEM_DESTROYED; … … 624 618 return VERR_TIMEOUT; 625 619 default: 626 AssertMsgFailed(("p MutexInt->u32Magic=%RX32 pMutexInt=%p: wait returned %lx!\n",627 p MutexInt->u32Magic, pMutexInt, (long)rcNt));620 AssertMsgFailed(("pThis->u32Magic=%RX32 pThis=%p: wait returned %lx!\n", 621 pThis->u32Magic, pThis, (long)rcNt)); 628 622 return VERR_INTERNAL_ERROR; 629 623 } … … 638 632 * Validate input. 639 633 */ 640 PRTSEMMUTEXINTERNAL pMutexInt = (PRTSEMMUTEXINTERNAL)MutexSem; 641 if (!pMutexInt) 642 return VERR_INVALID_PARAMETER; 643 if ( !pMutexInt 644 || pMutexInt->u32Magic != RTSEMMUTEX_MAGIC) 645 { 646 AssertMsgFailed(("pMutexInt->u32Magic=%RX32 pMutexInt=%p\n", pMutexInt ? pMutexInt->u32Magic : 0, pMutexInt)); 647 return VERR_INVALID_PARAMETER; 648 } 634 PRTSEMMUTEXINTERNAL pThis = (PRTSEMMUTEXINTERNAL)MutexSem; 635 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 636 AssertMsg(pThis->u32Magic == RTSEMMUTEX_MAGIC, ("u32Magic=%RX32 pThis=%p\n", pThis->u32Magic, pThis), VERR_INVALID_HANDLE); 649 637 RT_ASSERT_PREEMPTIBLE(); 650 638 … … 653 641 */ 654 642 #ifdef RT_USE_FAST_MUTEX 655 ExReleaseFastMutex(&p MutexInt->Mutex);643 ExReleaseFastMutex(&pThis->Mutex); 656 644 #else 657 KeReleaseMutex(&p MutexInt->Mutex, FALSE);645 KeReleaseMutex(&pThis->Mutex, FALSE); 658 646 #endif 659 647 return VINF_SUCCESS; -
trunk/src/VBox/Runtime/r0drv/freebsd/semeventmulti-r0drv-freebsd.c
r22819 r25720 64 64 65 65 66 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem) 67 { 68 Assert(sizeof(RTSEMEVENTMULTIINTERNAL) > sizeof(void *)); 69 AssertPtrReturn(pEventMultiSem, VERR_INVALID_POINTER); 70 71 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)RTMemAllocZ(sizeof(*pEventMultiInt)); 72 if (pEventMultiInt) 73 { 74 pEventMultiInt->u32Magic = RTSEMEVENTMULTI_MAGIC; 75 pEventMultiInt->cWaiters = 0; 76 pEventMultiInt->cWaking = 0; 77 pEventMultiInt->fSignaled = 0; 78 int rc = RTSpinlockCreate(&pEventMultiInt->hSpinLock); 66 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem) 67 { 68 return RTSemEventMultiCreateEx(phEventMultiSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, NULL); 69 } 70 71 72 RTDECL(int) RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass, 73 const char *pszNameFmt, ...) 74 { 75 AssertCompile(sizeof(RTSEMEVENTMULTIINTERNAL) > sizeof(void *)); 76 AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER); 77 AssertPtrReturn(phEventMultiSem, VERR_INVALID_POINTER); 78 79 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)RTMemAllocZ(sizeof(*pThis)); 80 if (pThis) 81 { 82 pThis->u32Magic = RTSEMEVENTMULTI_MAGIC; 83 pThis->cWaiters = 0; 84 pThis->cWaking = 0; 85 pThis->fSignaled = 0; 86 int rc = RTSpinlockCreate(&pThis->hSpinLock); 79 87 if (RT_SUCCESS(rc)) 80 88 { 81 *p EventMultiSem = pEventMultiInt;89 *phEventMultiSem = pThis; 82 90 return VINF_SUCCESS; 83 91 } 84 92 85 RTMemFree(p EventMultiInt);93 RTMemFree(pThis); 86 94 return rc; 87 95 } … … 90 98 91 99 92 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem) 93 { 94 if (EventMultiSem == NIL_RTSEMEVENTMULTI) /* don't bitch */ 95 return VERR_INVALID_HANDLE; 96 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem; 100 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem) 101 { 102 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 97 103 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 98 104 99 AssertPtrReturn(pEventMultiInt, VERR_INVALID_HANDLE); 100 AssertMsgReturn(pEventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC, 101 ("pEventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic), 105 if (pThis == NIL_RTSEMEVENTMULTI) 106 return VINF_SUCCESS; 107 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 108 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE); 109 110 RTSpinlockAcquire(pThis->hSpinLock, &Tmp); 111 ASMAtomicIncU32(&pThis->u32Magic); /* make the handle invalid */ 112 if (pThis->cWaiters > 0) 113 { 114 /* abort waiting thread, last man cleans up. */ 115 ASMAtomicXchgU32(&pThis->cWaking, pThis->cWaking + pThis->cWaiters); 116 sleepq_lock(pThis); 117 sleepq_broadcast(pThis, SLEEPQ_CONDVAR, 0, 0); 118 sleepq_release(pThis); 119 RTSpinlockRelease(pThis->hSpinLock, &Tmp); 120 } 121 else if (pThis->cWaking) 122 /* the last waking thread is gonna do the cleanup */ 123 RTSpinlockRelease(pThis->hSpinLock, &Tmp); 124 else 125 { 126 RTSpinlockRelease(pThis->hSpinLock, &Tmp); 127 RTSpinlockDestroy(pThis->hSpinLock); 128 RTMemFree(pThis); 129 } 130 131 return VINF_SUCCESS; 132 } 133 134 135 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem) 136 { 137 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 138 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 139 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 140 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, 141 ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), 102 142 VERR_INVALID_HANDLE); 103 143 104 RTSpinlockAcquire(pEventMultiInt->hSpinLock, &Tmp); 105 ASMAtomicIncU32(&pEventMultiInt->u32Magic); /* make the handle invalid */ 106 if (pEventMultiInt->cWaiters > 0) 107 { 108 /* abort waiting thread, last man cleans up. */ 109 ASMAtomicXchgU32(&pEventMultiInt->cWaking, pEventMultiInt->cWaking + pEventMultiInt->cWaiters); 110 sleepq_lock(pEventMultiInt); 111 sleepq_broadcast(pEventMultiInt, SLEEPQ_CONDVAR, 0, 0); 112 sleepq_release(pEventMultiInt); 113 RTSpinlockRelease(pEventMultiInt->hSpinLock, &Tmp); 114 } 115 else if (pEventMultiInt->cWaking) 116 /* the last waking thread is gonna do the cleanup */ 117 RTSpinlockRelease(pEventMultiInt->hSpinLock, &Tmp); 118 else 119 { 120 RTSpinlockRelease(pEventMultiInt->hSpinLock, &Tmp); 121 RTSpinlockDestroy(pEventMultiInt->hSpinLock); 122 RTMemFree(pEventMultiInt); 123 } 124 125 return VINF_SUCCESS; 126 } 127 128 129 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem) 130 { 131 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 132 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem; 133 AssertPtrReturn(pEventMultiInt, VERR_INVALID_HANDLE); 134 AssertMsgReturn(pEventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC, 135 ("pEventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic), 136 VERR_INVALID_HANDLE); 137 138 RTSpinlockAcquire(pEventMultiInt->hSpinLock, &Tmp); 139 140 ASMAtomicXchgU8(&pEventMultiInt->fSignaled, true); 141 if (pEventMultiInt->cWaiters > 0) 142 { 143 ASMAtomicXchgU32(&pEventMultiInt->cWaking, pEventMultiInt->cWaking + pEventMultiInt->cWaiters); 144 ASMAtomicXchgU32(&pEventMultiInt->cWaiters, 0); 145 sleepq_lock(pEventMultiInt); 146 int fWakeupSwapProc = sleepq_signal(pEventMultiInt, SLEEPQ_CONDVAR, 0, 0); 147 sleepq_release(pEventMultiInt); 144 RTSpinlockAcquire(pThis->hSpinLock, &Tmp); 145 146 ASMAtomicXchgU8(&pThis->fSignaled, true); 147 if (pThis->cWaiters > 0) 148 { 149 ASMAtomicXchgU32(&pThis->cWaking, pThis->cWaking + pThis->cWaiters); 150 ASMAtomicXchgU32(&pThis->cWaiters, 0); 151 sleepq_lock(pThis); 152 int fWakeupSwapProc = sleepq_signal(pThis, SLEEPQ_CONDVAR, 0, 0); 153 sleepq_release(pThis); 148 154 if (fWakeupSwapProc) 149 155 kick_proc0(); 150 156 } 151 157 152 RTSpinlockRelease(p EventMultiInt->hSpinLock, &Tmp);158 RTSpinlockRelease(pThis->hSpinLock, &Tmp); 153 159 return VINF_SUCCESS; 154 160 } 155 161 156 162 157 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem)163 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem) 158 164 { 159 165 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 160 PRTSEMEVENTMULTIINTERNAL p EventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem;161 AssertPtrReturn(p EventMultiInt, VERR_INVALID_HANDLE);162 AssertMsgReturn(p EventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC,163 ("p EventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic),166 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 167 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 168 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, 169 ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), 164 170 VERR_INVALID_HANDLE); 165 171 166 RTSpinlockAcquire(p EventMultiInt->hSpinLock, &Tmp);167 ASMAtomicXchgU8(&p EventMultiInt->fSignaled, false);168 RTSpinlockRelease(p EventMultiInt->hSpinLock, &Tmp);172 RTSpinlockAcquire(pThis->hSpinLock, &Tmp); 173 ASMAtomicXchgU8(&pThis->fSignaled, false); 174 RTSpinlockRelease(pThis->hSpinLock, &Tmp); 169 175 return VINF_SUCCESS; 170 176 } 171 177 172 178 173 static int rtSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies, bool fInterruptible)179 static int rtSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies, bool fInterruptible) 174 180 { 175 181 int rc; 176 182 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 177 PRTSEMEVENTMULTIINTERNAL p EventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem;178 AssertPtrReturn(p EventMultiInt, VERR_INVALID_HANDLE);179 AssertMsgReturn(p EventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC,180 ("p EventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic),183 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 184 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 185 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, 186 ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), 181 187 VERR_INVALID_HANDLE); 182 188 183 RTSpinlockAcquire(p EventMultiInt->hSpinLock, &Tmp);184 185 if (p EventMultiInt->fSignaled)189 RTSpinlockAcquire(pThis->hSpinLock, &Tmp); 190 191 if (pThis->fSignaled) 186 192 rc = VINF_SUCCESS; 187 193 else … … 191 197 else 192 198 { 193 ASMAtomicIncU32(&p EventMultiInt->cWaiters);199 ASMAtomicIncU32(&pThis->cWaiters); 194 200 195 201 int fFlags = SLEEPQ_CONDVAR; … … 198 204 fFlags |= SLEEPQ_INTERRUPTIBLE; 199 205 200 sleepq_lock(p EventMultiInt);201 sleepq_add(p EventMultiInt, NULL, "IPRT Event Semaphore", fFlags, 0);206 sleepq_lock(pThis); 207 sleepq_add(pThis, NULL, "IPRT Event Semaphore", fFlags, 0); 202 208 203 209 if (cMillies != RT_INDEFINITE_WAIT) … … 211 217 tv.tv_usec = (cMillies % 1000) * 1000; 212 218 213 sleepq_set_timeout(p EventMultiInt, tvtohz(&tv));214 215 RTSpinlockRelease(p EventMultiInt->hSpinLock, &Tmp);219 sleepq_set_timeout(pThis, tvtohz(&tv)); 220 221 RTSpinlockRelease(pThis->hSpinLock, &Tmp); 216 222 217 223 if (fInterruptible) 218 rc = SLEEPQ_TIMEDWAIT_SIG(p EventMultiInt);224 rc = SLEEPQ_TIMEDWAIT_SIG(pThis); 219 225 else 220 rc = SLEEPQ_TIMEDWAIT(p EventMultiInt);226 rc = SLEEPQ_TIMEDWAIT(pThis); 221 227 } 222 228 else 223 229 { 224 RTSpinlockRelease(p EventMultiInt->hSpinLock, &Tmp);230 RTSpinlockRelease(pThis->hSpinLock, &Tmp); 225 231 226 232 if (fInterruptible) 227 rc = SLEEPQ_WAIT_SIG(p EventMultiInt);233 rc = SLEEPQ_WAIT_SIG(pThis); 228 234 else 229 235 { 230 236 rc = 0; 231 SLEEPQ_WAIT(p EventMultiInt);237 SLEEPQ_WAIT(pThis); 232 238 } 233 239 } 234 240 235 RTSpinlockAcquire(p EventMultiInt->hSpinLock, &Tmp);241 RTSpinlockAcquire(pThis->hSpinLock, &Tmp); 236 242 237 243 switch (rc) 238 244 { 239 245 case 0: 240 if (p EventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC)246 if (pThis->u32Magic == RTSEMEVENTMULTI_MAGIC) 241 247 { 242 ASMAtomicDecU32(&p EventMultiInt->cWaking);248 ASMAtomicDecU32(&pThis->cWaking); 243 249 rc = VINF_SUCCESS; 244 250 } … … 247 253 rc = VERR_SEM_DESTROYED; /** @todo this isn't necessarily correct, we've 248 254 * could've woken up just before destruction... */ 249 if (!ASMAtomicDecU32(&p EventMultiInt->cWaking))255 if (!ASMAtomicDecU32(&pThis->cWaking)) 250 256 { 251 257 /* The event was destroyed, as the last thread do the cleanup. 252 258 we don't actually know whether */ 253 RTSpinlockRelease(p EventMultiInt->hSpinLock, &Tmp);254 RTSpinlockDestroy(p EventMultiInt->hSpinLock);255 RTMemFree(p EventMultiInt);259 RTSpinlockRelease(pThis->hSpinLock, &Tmp); 260 RTSpinlockDestroy(pThis->hSpinLock); 261 RTMemFree(pThis); 256 262 return rc; 257 263 } … … 261 267 case EWOULDBLOCK: 262 268 Assert(cMillies != RT_INDEFINITE_WAIT); 263 if (p EventMultiInt->cWaiters > 0)264 ASMAtomicDecU32(&p EventMultiInt->cWaiters);269 if (pThis->cWaiters > 0) 270 ASMAtomicDecU32(&pThis->cWaiters); 265 271 rc = VERR_TIMEOUT; 266 272 break; … … 269 275 case ERESTART: 270 276 Assert(fInterruptible); 271 if (p EventMultiInt->cWaiters > 0)272 ASMAtomicDecU32(&p EventMultiInt->cWaiters);277 if (pThis->cWaiters > 0) 278 ASMAtomicDecU32(&pThis->cWaiters); 273 279 rc = VERR_INTERRUPTED; 274 280 break; … … 282 288 } 283 289 284 RTSpinlockRelease(p EventMultiInt->hSpinLock, &Tmp);290 RTSpinlockRelease(pThis->hSpinLock, &Tmp); 285 291 return rc; 286 292 } 287 293 288 294 289 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)290 { 291 return rtSemEventMultiWait( EventMultiSem, cMillies, false /* not interruptible */);292 } 293 294 295 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)296 { 297 return rtSemEventMultiWait( EventMultiSem, cMillies, true /* interruptible */);298 } 299 295 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 296 { 297 return rtSemEventMultiWait(hEventMultiSem, cMillies, false /* not interruptible */); 298 } 299 300 301 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 302 { 303 return rtSemEventMultiWait(hEventMultiSem, cMillies, true /* interruptible */); 304 } 305 -
trunk/src/VBox/Runtime/r0drv/linux/semeventmulti-r0drv-linux.c
r24956 r25720 62 62 63 63 64 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem) 65 { 64 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem) 65 { 66 return RTSemEventMultiCreateEx(phEventMultiSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, NULL); 67 } 68 69 70 RTDECL(int) RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass, 71 const char *pszNameFmt, ...) 72 { 73 AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER); 74 66 75 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)RTMemAlloc(sizeof(*pThis)); 67 76 if (pThis) … … 70 79 pThis->fState = 0; 71 80 init_waitqueue_head(&pThis->Head); 72 *pEventMultiSem = pThis; 81 82 *phEventMultiSem = pThis; 73 83 return VINF_SUCCESS; 74 84 } … … 78 88 79 89 80 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem)90 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem) 81 91 { 82 92 /* 83 93 * Validate input. 84 94 */ 85 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL) EventMultiSem;86 if ( !pThis)87 return V ERR_INVALID_PARAMETER;95 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 96 if (pThis == NIL_RTSEMEVENTMULTI) 97 return VINF_SUCCESS; 88 98 AssertPtrReturn(pThis, VERR_INVALID_PARAMETER); 89 99 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, ("%p u32Magic=%RX32\n", pThis, pThis->u32Magic), VERR_INVALID_PARAMETER); … … 92 102 * Invalidate it and signal the object just in case. 93 103 */ 94 ASMAtomic IncU32(&pThis->u32Magic);104 ASMAtomicWriteU32(&pThis->u32Magic, ~RTSEMEVENTMULTI_MAGIC); 95 105 ASMAtomicXchgU32(&pThis->fState, 0); 96 106 Assert(!waitqueue_active(&pThis->Head)); … … 102 112 103 113 104 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem)114 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem) 105 115 { 106 116 /* 107 117 * Validate input. 108 118 */ 109 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL) EventMultiSem;119 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 110 120 if (!pThis) 111 121 return VERR_INVALID_PARAMETER; … … 123 133 124 134 125 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem)135 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem) 126 136 { 127 137 /* 128 138 * Validate input. 129 139 */ 130 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL) EventMultiSem;140 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 131 141 if (!pThis) 132 142 return VERR_INVALID_PARAMETER; … … 206 216 207 217 208 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)209 { 210 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL) EventMultiSem;218 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 219 { 220 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 211 221 if (!pThis) 212 222 return VERR_INVALID_PARAMETER; … … 221 231 222 232 223 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)224 { 225 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL) EventMultiSem;233 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 234 { 235 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 226 236 if (!pThis) 227 237 return VERR_INVALID_PARAMETER; -
trunk/src/VBox/Runtime/r0drv/nt/semeventmulti-r0drv-nt.cpp
r20923 r25720 58 58 59 59 60 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventSem)60 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem) 61 61 { 62 Assert(sizeof(RTSEMEVENTMULTIINTERNAL) > sizeof(void *)); 62 return RTSemEventMultiCreateEx(phEventMultiSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, NULL); 63 } 64 65 66 RTDECL(int) RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass, 67 const char *pszNameFmt, ...) 68 { 69 AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER); 70 71 AssertCompile(sizeof(RTSEMEVENTMULTIINTERNAL) > sizeof(void *)); 63 72 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)RTMemAlloc(sizeof(*pThis)); 64 73 if (pThis) … … 66 75 pThis->u32Magic = RTSEMEVENTMULTI_MAGIC; 67 76 KeInitializeEvent(&pThis->Event, NotificationEvent, FALSE /* not signalled */); 68 *pEventSem = pThis; 77 78 *phEventSem = pThis; 69 79 return VINF_SUCCESS; 70 80 } … … 73 83 74 84 75 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem)85 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem) 76 86 { 77 87 /* 78 88 * Validate input. 79 89 */ 80 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL) EventMultiSem;81 if ( !pThis)82 return V ERR_INVALID_PARAMETER;90 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 91 if (pThis == NIL_RTSEMEVENTMULTI) 92 return VINF_SUCCESS; 83 93 AssertPtrReturn(pThis, VERR_INVALID_PARAMETER); 84 94 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, ("%p u32Magic=%RX32\n", pThis, pThis->u32Magic), VERR_INVALID_PARAMETER); … … 94 104 95 105 96 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem)106 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem) 97 107 { 98 108 /* 99 109 * Validate input. 100 110 */ 101 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL) EventMultiSem;111 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 102 112 if (!pThis) 103 113 return VERR_INVALID_PARAMETER; … … 113 123 114 124 115 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem)125 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem) 116 126 { 117 127 /* 118 128 * Validate input. 119 129 */ 120 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL) EventMultiSem;130 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 121 131 if (!pThis) 122 132 return VERR_INVALID_PARAMETER; … … 132 142 133 143 134 static int rtSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies, bool fInterruptible)144 static int rtSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies, bool fInterruptible) 135 145 { 136 146 /* 137 147 * Validate input. 138 148 */ 139 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL) EventMultiSem;149 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 140 150 if (!pThis) 141 151 return VERR_INVALID_PARAMETER; … … 177 187 178 188 179 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)189 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 180 190 { 181 return rtSemEventMultiWait( EventMultiSem, cMillies, false /* fInterruptible */);191 return rtSemEventMultiWait(hEventMultiSem, cMillies, false /* fInterruptible */); 182 192 } 183 193 184 194 185 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)195 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 186 196 { 187 return rtSemEventMultiWait( EventMultiSem, cMillies, true /* fInterruptible */);197 return rtSemEventMultiWait(hEventMultiSem, cMillies, true /* fInterruptible */); 188 198 } 189 199 -
trunk/src/VBox/Runtime/r0drv/os2/semeventmulti-r0drv-os2.cpp
r8245 r25720 64 64 65 65 66 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem) 67 { 68 Assert(sizeof(RTSEMEVENTMULTIINTERNAL) > sizeof(void *)); 69 AssertPtrReturn(pEventMultiSem, VERR_INVALID_POINTER); 70 71 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)RTMemAlloc(sizeof(*pEventMultiInt)); 72 if (pEventMultiInt) 73 { 74 pEventMultiInt->u32Magic = RTSEMEVENTMULTI_MAGIC; 75 pEventMultiInt->cWaiters = 0; 76 pEventMultiInt->cWaking = 0; 77 pEventMultiInt->fSignaled = 0; 78 KernAllocSpinLock(&pEventMultiInt->Spinlock); 79 *pEventMultiSem = pEventMultiInt; 66 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem) 67 { 68 return RTSemEventMultiCreateEx(phEventMultiSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, NULL); 69 } 70 71 72 RTDECL(int) RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass, 73 const char *pszNameFmt, ...) 74 { 75 AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER); 76 AssertPtrReturn(phEventMultiSem, VERR_INVALID_POINTER); 77 78 AssertCompile(sizeof(RTSEMEVENTMULTIINTERNAL) > sizeof(void *)); 79 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)RTMemAlloc(sizeof(*pThis)); 80 if (pThis) 81 { 82 pThis->u32Magic = RTSEMEVENTMULTI_MAGIC; 83 pThis->cWaiters = 0; 84 pThis->cWaking = 0; 85 pThis->fSignaled = 0; 86 KernAllocSpinLock(&pThis->Spinlock); 87 88 *phEventMultiSem = pThis; 80 89 return VINF_SUCCESS; 81 90 } … … 84 93 85 94 86 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem) 87 { 88 if (EventMultiSem == NIL_RTSEMEVENTMULTI) /* don't bitch */ 89 return VERR_INVALID_HANDLE; 90 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem; 91 AssertPtrReturn(pEventMultiInt, VERR_INVALID_HANDLE); 92 AssertMsgReturn(pEventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC, 93 ("pEventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic), 95 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem) 96 { 97 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 98 if (pThis == NIL_RTSEMEVENTMULTI) 99 return VINF_SUCCESS; 100 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 101 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE); 102 103 KernAcquireSpinLock(&pThis->Spinlock); 104 ASMAtomicIncU32(&pThis->u32Magic); /* make the handle invalid */ 105 if (pThis->cWaiters > 0) 106 { 107 /* abort waiting thread, last man cleans up. */ 108 ASMAtomicXchgU32(&pThis->cWaking, pThis->cWaking + pThis->cWaiters); 109 ULONG cThreads; 110 KernWakeup((ULONG)pThis, WAKEUP_DATA | WAKEUP_BOOST, &cThreads, (ULONG)VERR_SEM_DESTROYED); 111 KernReleaseSpinLock(&pThis->Spinlock); 112 } 113 else if (pThis->cWaking) 114 /* the last waking thread is gonna do the cleanup */ 115 KernReleaseSpinLock(&pThis->Spinlock); 116 else 117 { 118 KernReleaseSpinLock(&pThis->Spinlock); 119 KernFreeSpinLock(&pThis->Spinlock); 120 RTMemFree(pThis); 121 } 122 123 return VINF_SUCCESS; 124 } 125 126 127 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem) 128 { 129 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 130 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 131 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, 132 ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), 94 133 VERR_INVALID_HANDLE); 95 134 96 KernAcquireSpinLock(&pEventMultiInt->Spinlock); 97 ASMAtomicIncU32(&pEventMultiInt->u32Magic); /* make the handle invalid */ 98 if (pEventMultiInt->cWaiters > 0) 99 { 100 /* abort waiting thread, last man cleans up. */ 101 ASMAtomicXchgU32(&pEventMultiInt->cWaking, pEventMultiInt->cWaking + pEventMultiInt->cWaiters); 135 KernAcquireSpinLock(&pThis->Spinlock); 136 137 ASMAtomicXchgU8(&pThis->fSignaled, true); 138 if (pThis->cWaiters > 0) 139 { 140 ASMAtomicXchgU32(&pThis->cWaking, pThis->cWaking + pThis->cWaiters); 141 ASMAtomicXchgU32(&pThis->cWaiters, 0); 102 142 ULONG cThreads; 103 KernWakeup((ULONG)pEventMultiInt, WAKEUP_DATA | WAKEUP_BOOST, &cThreads, (ULONG)VERR_SEM_DESTROYED); 104 KernReleaseSpinLock(&pEventMultiInt->Spinlock); 105 } 106 else if (pEventMultiInt->cWaking) 107 /* the last waking thread is gonna do the cleanup */ 108 KernReleaseSpinLock(&pEventMultiInt->Spinlock); 109 else 110 { 111 KernReleaseSpinLock(&pEventMultiInt->Spinlock); 112 KernFreeSpinLock(&pEventMultiInt->Spinlock); 113 RTMemFree(pEventMultiInt); 114 } 115 143 KernWakeup((ULONG)pThis, WAKEUP_DATA, &cThreads, VINF_SUCCESS); 144 } 145 146 KernReleaseSpinLock(&pThis->Spinlock); 116 147 return VINF_SUCCESS; 117 148 } 118 149 119 150 120 RTDECL(int) RTSemEventMulti Signal(RTSEMEVENTMULTIEventMultiSem)121 { 122 PRTSEMEVENTMULTIINTERNAL p EventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem;123 AssertPtrReturn(p EventMultiInt, VERR_INVALID_HANDLE);124 AssertMsgReturn(p EventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC,125 ("p EventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic),151 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem) 152 { 153 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 154 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 155 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, 156 ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), 126 157 VERR_INVALID_HANDLE); 127 158 128 KernAcquireSpinLock(&pEventMultiInt->Spinlock); 129 130 ASMAtomicXchgU8(&pEventMultiInt->fSignaled, true); 131 if (pEventMultiInt->cWaiters > 0) 132 { 133 ASMAtomicXchgU32(&pEventMultiInt->cWaking, pEventMultiInt->cWaking + pEventMultiInt->cWaiters); 134 ASMAtomicXchgU32(&pEventMultiInt->cWaiters, 0); 135 ULONG cThreads; 136 KernWakeup((ULONG)pEventMultiInt, WAKEUP_DATA, &cThreads, VINF_SUCCESS); 137 } 138 139 KernReleaseSpinLock(&pEventMultiInt->Spinlock); 159 KernAcquireSpinLock(&pThis->Spinlock); 160 ASMAtomicXchgU8(&pThis->fSignaled, false); 161 KernReleaseSpinLock(&pThis->Spinlock); 140 162 return VINF_SUCCESS; 141 163 } 142 164 143 165 144 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem)145 { 146 PRTSEMEVENTMULTIINTERNAL p EventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem;147 AssertPtrReturn(p EventMultiInt, VERR_INVALID_HANDLE);148 AssertMsgReturn(p EventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC,149 ("p EventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic),166 static int rtSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies, bool fInterruptible) 167 { 168 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 169 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 170 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, 171 ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), 150 172 VERR_INVALID_HANDLE); 151 173 152 KernAcquireSpinLock(&pEventMultiInt->Spinlock); 153 ASMAtomicXchgU8(&pEventMultiInt->fSignaled, false); 154 KernReleaseSpinLock(&pEventMultiInt->Spinlock); 155 return VINF_SUCCESS; 156 } 157 158 159 static int rtSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies, bool fInterruptible) 160 { 161 PRTSEMEVENTMULTIINTERNAL pEventMultiInt = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem; 162 AssertPtrReturn(pEventMultiInt, VERR_INVALID_HANDLE); 163 AssertMsgReturn(pEventMultiInt->u32Magic == RTSEMEVENTMULTI_MAGIC, 164 ("pEventMultiInt=%p u32Magic=%#x\n", pEventMultiInt, pEventMultiInt->u32Magic), 165 VERR_INVALID_HANDLE); 166 167 KernAcquireSpinLock(&pEventMultiInt->Spinlock); 174 KernAcquireSpinLock(&pThis->Spinlock); 168 175 169 176 int rc; 170 if (p EventMultiInt->fSignaled)177 if (pThis->fSignaled) 171 178 rc = VINF_SUCCESS; 172 179 else 173 180 { 174 ASMAtomicIncU32(&p EventMultiInt->cWaiters);181 ASMAtomicIncU32(&pThis->cWaiters); 175 182 176 183 ULONG ulData = (ULONG)VERR_INTERNAL_ERROR; 177 rc = KernBlock((ULONG)p EventMultiInt,184 rc = KernBlock((ULONG)pThis, 178 185 cMillies == RT_INDEFINITE_WAIT ? SEM_INDEFINITE_WAIT : cMillies, 179 186 BLOCK_SPINLOCK | (!fInterruptible ? BLOCK_UNINTERRUPTABLE : 0), 180 &p EventMultiInt->Spinlock,187 &pThis->Spinlock, 181 188 &ulData); 182 189 switch (rc) … … 185 192 rc = (int)ulData; 186 193 Assert(rc == VINF_SUCCESS || rc == VERR_SEM_DESTROYED); 187 Assert(p EventMultiInt->cWaking > 0);188 if ( !ASMAtomicDecU32(&p EventMultiInt->cWaking)189 && p EventMultiInt->u32Magic != RTSEMEVENTMULTI_MAGIC)194 Assert(pThis->cWaking > 0); 195 if ( !ASMAtomicDecU32(&pThis->cWaking) 196 && pThis->u32Magic != RTSEMEVENTMULTI_MAGIC) 190 197 { 191 198 /* The event was destroyed (ulData == VINF_SUCCESS if it was after we awoke), as 192 199 the last thread do the cleanup. */ 193 KernReleaseSpinLock(&p EventMultiInt->Spinlock);194 KernFreeSpinLock(&p EventMultiInt->Spinlock);195 RTMemFree(p EventMultiInt);200 KernReleaseSpinLock(&pThis->Spinlock); 201 KernFreeSpinLock(&pThis->Spinlock); 202 RTMemFree(pThis); 196 203 return VINF_SUCCESS; 197 204 } … … 201 208 case ERROR_TIMEOUT: 202 209 Assert(cMillies != RT_INDEFINITE_WAIT); 203 ASMAtomicDecU32(&p EventMultiInt->cWaiters);210 ASMAtomicDecU32(&pThis->cWaiters); 204 211 rc = VERR_TIMEOUT; 205 212 break; … … 207 214 case ERROR_INTERRUPT: 208 215 Assert(fInterruptible); 209 ASMAtomicDecU32(&p EventMultiInt->cWaiters);216 ASMAtomicDecU32(&pThis->cWaiters); 210 217 rc = VERR_INTERRUPTED; 211 218 break; … … 218 225 } 219 226 220 KernReleaseSpinLock(&p EventMultiInt->Spinlock);227 KernReleaseSpinLock(&pThis->Spinlock); 221 228 return rc; 222 229 } 223 230 224 231 225 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)226 { 227 return rtSemEventMultiWait( EventMultiSem, cMillies, false /* not interruptible */);228 } 229 230 231 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)232 { 233 return rtSemEventMultiWait( EventMultiSem, cMillies, true /* interruptible */);234 } 235 232 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 233 { 234 return rtSemEventMultiWait(hEventMultiSem, cMillies, false /* not interruptible */); 235 } 236 237 238 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 239 { 240 return rtSemEventMultiWait(hEventMultiSem, cMillies, true /* interruptible */); 241 } 242 -
trunk/src/VBox/Runtime/r0drv/solaris/semeventmulti-r0drv-solaris.c
r25183 r25720 70 70 71 71 72 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem) 73 { 74 Assert(sizeof(RTSEMEVENTMULTIINTERNAL) > sizeof(void *)); 75 AssertPtrReturn(pEventMultiSem, VERR_INVALID_POINTER); 72 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem) 73 { 74 return RTSemEventMultiCreateEx(phEventMultiSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, NULL); 75 } 76 77 78 RTDECL(int) RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass, 79 const char *pszNameFmt, ...) 80 { 81 AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER); 82 AssertPtrReturn(phEventMultiSem, VERR_INVALID_POINTER); 76 83 RT_ASSERT_PREEMPTIBLE(); 77 84 85 AssertCompile(sizeof(RTSEMEVENTMULTIINTERNAL) > sizeof(void *)); 78 86 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)RTMemAlloc(sizeof(*pThis)); 79 87 if (pThis) … … 85 93 mutex_init(&pThis->Mtx, "IPRT Multiple Release Event Semaphore", MUTEX_DRIVER, (void *)ipltospl(DISP_LEVEL)); 86 94 cv_init(&pThis->Cnd, "IPRT CV", CV_DRIVER, NULL); 87 *pEventMultiSem = pThis; 95 96 *phEventMultiSem = pThis; 88 97 return VINF_SUCCESS; 89 98 } … … 92 101 93 102 94 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem)95 { 96 if (EventMultiSem == NIL_RTSEMEVENTMULTI) /* don't bitch */97 return VERR_INVALID_HANDLE;98 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)EventMultiSem;103 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem) 104 { 105 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 106 if (pThis == NIL_RTSEMEVENTMULTI) 107 return VINF_SUCCESS; 99 108 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 100 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, 101 ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), 102 VERR_INVALID_HANDLE); 109 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, ("pThis=%p u32Magic=%#x\n", pThis, pThis->u32Magic), VERR_INVALID_HANDLE); 103 110 RT_ASSERT_INTS_ON(); 104 111 … … 127 134 128 135 129 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem)130 { 131 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL) EventMultiSem;136 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem) 137 { 138 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 132 139 RT_ASSERT_PREEMPT_CPUID_VAR(); 133 140 … … 172 179 173 180 174 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem)175 { 176 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL) EventMultiSem;181 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem) 182 { 183 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 177 184 RT_ASSERT_PREEMPT_CPUID_VAR(); 178 185 … … 210 217 211 218 212 static int rtSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies, bool fInterruptible)219 static int rtSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies, bool fInterruptible) 213 220 { 214 221 int rc; 215 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL) EventMultiSem;222 PRTSEMEVENTMULTIINTERNAL pThis = (PRTSEMEVENTMULTIINTERNAL)hEventMultiSem; 216 223 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 217 224 AssertMsgReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, … … 294 301 295 302 296 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)297 { 298 return rtSemEventMultiWait( EventMultiSem, cMillies, false /* not interruptible */);299 } 300 301 302 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)303 { 304 return rtSemEventMultiWait( EventMultiSem, cMillies, true /* interruptible */);305 } 306 303 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 304 { 305 return rtSemEventMultiWait(hEventMultiSem, cMillies, false /* not interruptible */); 306 } 307 308 309 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 310 { 311 return rtSemEventMultiWait(hEventMultiSem, cMillies, true /* interruptible */); 312 } 313 -
trunk/src/VBox/Runtime/r3/linux/semeventmulti-linux.cpp
r25704 r25720 31 31 32 32 #include <features.h> 33 #if __GLIBC_PREREQ(2,6) && !defined(IPRT_WITH_FUTEX_BASED_SEMS) && !defined(DEBUG_bird)33 #if __GLIBC_PREREQ(2,6) && !defined(IPRT_WITH_FUTEX_BASED_SEMS) 34 34 35 35 /* … … 119 119 120 120 121 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem) 122 { 121 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem) 122 { 123 return RTSemEventMultiCreateEx(phEventMultiSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, NULL); 124 } 125 126 127 RTDECL(int) RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass, 128 const char *pszNameFmt, ...) 129 { 130 AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER); 131 123 132 /* 124 133 * Allocate semaphore handle. … … 130 139 pThis->iState = 0; 131 140 #ifdef RTSEMEVENTMULTI_STRICT 132 RTLockValidatorRecSharedInit(&pThis->Signallers, 133 NIL_RTLOCKVALCLASS, RTLOCKVAL_SUB_CLASS_ANY, 134 pThis, true /*fSignaller*/, true /*fEnabled*/, "RTSemEvent"); 141 va_list va; 142 va_start(va, pszNameFmt); 143 RTLockValidatorRecSharedInitV(&pThis->Signallers, hClass, RTLOCKVAL_SUB_CLASS_ANY, pThis, 144 true /*fSignaller*/, !(fFlags & RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), 145 pszNameFmt, va); 146 va_end(va); 135 147 pThis->fEverHadSignallers = false; 136 148 #endif 137 *pEventMultiSem = pThis; 149 150 *phEventMultiSem = pThis; 138 151 return VINF_SUCCESS; 139 152 } … … 142 155 143 156 144 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem)157 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem) 145 158 { 146 159 /* 147 160 * Validate input. 148 161 */ 149 struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem; 150 AssertReturn(VALID_PTR(pThis) && pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, 151 VERR_INVALID_HANDLE); 162 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem; 163 if (pThis == NIL_RTSEMEVENTMULTI) 164 return VINF_SUCCESS; 165 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 166 AssertReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, VERR_INVALID_HANDLE); 152 167 153 168 /* … … 172 187 173 188 174 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem)189 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem) 175 190 { 176 191 /* 177 192 * Validate input. 178 193 */ 179 struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;194 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem; 180 195 AssertReturn(VALID_PTR(pThis) && pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, 181 196 VERR_INVALID_HANDLE); … … 206 221 207 222 208 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem)223 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem) 209 224 { 210 225 /* 211 226 * Validate input. 212 227 */ 213 struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;228 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem; 214 229 AssertReturn(VALID_PTR(pThis) && pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, 215 230 VERR_INVALID_HANDLE); … … 227 242 228 243 229 static int rtSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies, bool fAutoResume)244 static int rtSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies, bool fAutoResume) 230 245 { 231 246 PCRTLOCKVALSRCPOS pSrcPos = NULL; … … 234 249 * Validate input. 235 250 */ 236 struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;251 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem; 237 252 AssertReturn(VALID_PTR(pThis) && pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, 238 253 VERR_INVALID_HANDLE); … … 339 354 340 355 341 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)342 { 343 int rc = rtSemEventMultiWait( EventMultiSem, cMillies, true);356 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 357 { 358 int rc = rtSemEventMultiWait(hEventMultiSem, cMillies, true); 344 359 Assert(rc != VERR_INTERRUPTED); 345 360 return rc; … … 347 362 348 363 349 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)350 { 351 return rtSemEventMultiWait( EventMultiSem, cMillies, false);364 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 365 { 366 return rtSemEventMultiWait(hEventMultiSem, cMillies, false); 352 367 } 353 368 -
trunk/src/VBox/Runtime/r3/os2/sems-os2.cpp
r25717 r25720 148 148 149 149 150 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem) 151 { 150 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem) 151 { 152 return RTSemEventMultiCreateEx(phEventMultiSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, NULL); 153 } 154 155 156 RTDECL(int) RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass, 157 const char *pszNameFmt, ...) 158 { 159 AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER); 160 152 161 /* 153 162 * Create the semaphore. … … 158 167 if (!rc) 159 168 { 160 *pEventMultiSem = (RTSEMEVENTMULTI)(void *)hev; 161 return VINF_SUCCESS; 162 } 163 return RTErrConvertFromOS2(rc); 164 } 165 166 167 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem) 168 { 169 *phEventMultiSem = (RTSEMEVENTMULTI)(void *)hev; 170 return VINF_SUCCESS; 171 } 172 return RTErrConvertFromOS2(rc); 173 } 174 175 176 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem) 177 { 178 if (hEventMultiSem == NIL_RTSEMEVENTMULTI) 179 return VINF_SUCCESS; 180 169 181 /* 170 182 * Close semaphore handle. 171 183 */ 172 int rc = DosCloseEventSem(SEM2HND( EventMultiSem));173 if (!rc) 174 return VINF_SUCCESS; 175 AssertMsgFailed(("Destroy EventMultiSem %p failed, rc=%d\n",EventMultiSem, rc));176 return RTErrConvertFromOS2(rc); 177 } 178 179 180 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem)184 int rc = DosCloseEventSem(SEM2HND(hEventMultiSem)); 185 if (!rc) 186 return VINF_SUCCESS; 187 AssertMsgFailed(("Destroy hEventMultiSem %p failed, rc=%d\n", hEventMultiSem, rc)); 188 return RTErrConvertFromOS2(rc); 189 } 190 191 192 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem) 181 193 { 182 194 /* 183 195 * Signal the object. 184 196 */ 185 int rc = DosPostEventSem(SEM2HND( EventMultiSem));197 int rc = DosPostEventSem(SEM2HND(hEventMultiSem)); 186 198 switch (rc) 187 199 { … … 196 208 197 209 198 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem)210 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem) 199 211 { 200 212 /* … … 202 214 */ 203 215 ULONG ulIgnore; 204 int rc = DosResetEventSem(SEM2HND( EventMultiSem), &ulIgnore);216 int rc = DosResetEventSem(SEM2HND(hEventMultiSem), &ulIgnore); 205 217 switch (rc) 206 218 { … … 214 226 215 227 216 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)228 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 217 229 { 218 230 /* 219 231 * Wait for condition. 220 232 */ 221 int rc = DosWaitEventSem(SEM2HND( EventMultiSem), cMillies == RT_INDEFINITE_WAIT ? SEM_INDEFINITE_WAIT : cMillies);233 int rc = DosWaitEventSem(SEM2HND(hEventMultiSem), cMillies == RT_INDEFINITE_WAIT ? SEM_INDEFINITE_WAIT : cMillies); 222 234 switch (rc) 223 235 { … … 228 240 default: 229 241 { 230 AssertMsgFailed(("Wait on EventMultiSem %p failed, rc=%d\n",EventMultiSem, rc));242 AssertMsgFailed(("Wait on hEventMultiSem %p failed, rc=%d\n", hEventMultiSem, rc)); 231 243 return RTErrConvertFromOS2(rc); 232 244 } -
trunk/src/VBox/Runtime/r3/posix/semeventmulti-posix.cpp
r25704 r25720 86 86 87 87 88 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem) 89 { 88 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem) 89 { 90 return RTSemEventMultiCreateEx(phEventMultiSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, NULL); 91 } 92 93 94 RTDECL(int) RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass, 95 const char *pszNameFmt, ...) 96 { 97 AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER); 98 99 /* 100 * Allocate semaphore handle. 101 */ 90 102 int rc; 91 92 /*93 * Allocate semaphore handle.94 */95 103 struct RTSEMEVENTMULTIINTERNAL *pThis = (struct RTSEMEVENTMULTIINTERNAL *)RTMemAlloc(sizeof(struct RTSEMEVENTMULTIINTERNAL)); 96 104 if (pThis) … … 122 130 ASMAtomicXchgU32(&pThis->cWaiters, 0); 123 131 #ifdef RTSEMEVENTMULTI_STRICT 124 RTLockValidatorRecSharedInit(&pThis->Signallers, 125 NIL_RTLOCKVALCLASS, RTLOCKVAL_SUB_CLASS_ANY, 126 pThis, true /*fSignaller*/, true /*fEnabled*/, "RTSemEvent"); 132 va_list va; 133 va_start(va, pszNameFmt); 134 RTLockValidatorRecSharedInitV(&pThis->Signallers, hClass, RTLOCKVAL_SUB_CLASS_ANY, pThis, 135 true /*fSignaller*/, !(fFlags & RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), 136 pszNameFmt, va); 137 va_end(va); 127 138 pThis->fEverHadSignallers = false; 128 139 #endif 129 140 130 *p EventMultiSem = pThis;141 *phEventMultiSem = pThis; 131 142 return VINF_SUCCESS; 132 143 } … … 150 161 151 162 152 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem)163 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem) 153 164 { 154 165 /* 155 166 * Validate handle. 156 167 */ 157 struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;168 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem; 158 169 if (pThis == NIL_RTSEMEVENTMULTI) 159 170 return VINF_SUCCESS; … … 177 188 if (rc) 178 189 { 179 AssertMsgFailed(("Failed to destroy event sem %p, rc=%d.\n", EventMultiSem, rc));190 AssertMsgFailed(("Failed to destroy event sem %p, rc=%d.\n", hEventMultiSem, rc)); 180 191 return RTErrConvertFromErrno(rc); 181 192 } … … 194 205 if (rc) 195 206 { 196 AssertMsgFailed(("Failed to destroy event sem %p, rc=%d. (mutex)\n", EventMultiSem, rc));207 AssertMsgFailed(("Failed to destroy event sem %p, rc=%d. (mutex)\n", hEventMultiSem, rc)); 197 208 return RTErrConvertFromErrno(rc); 198 209 } … … 209 220 210 221 211 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem)222 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem) 212 223 { 213 224 /* 214 225 * Validate input. 215 226 */ 216 struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;227 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem; 217 228 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 218 229 uint32_t u32 = pThis->u32State; … … 234 245 if (rc) 235 246 { 236 AssertMsgFailed(("Failed to lock event sem %p, rc=%d.\n", EventMultiSem, rc));247 AssertMsgFailed(("Failed to lock event sem %p, rc=%d.\n", hEventMultiSem, rc)); 237 248 return RTErrConvertFromErrno(rc); 238 249 } … … 245 256 ASMAtomicXchgU32(&pThis->u32State, EVENTMULTI_STATE_SIGNALED); 246 257 rc = pthread_cond_broadcast(&pThis->Cond); 247 AssertMsg(!rc, ("Failed to signal event sem %p, rc=%d.\n", EventMultiSem, rc));258 AssertMsg(!rc, ("Failed to signal event sem %p, rc=%d.\n", hEventMultiSem, rc)); 248 259 } 249 260 else if (pThis->u32State == EVENTMULTI_STATE_SIGNALED) 250 261 { 251 262 rc = pthread_cond_broadcast(&pThis->Cond); /* give'm another kick... */ 252 AssertMsg(!rc, ("Failed to signal event sem %p, rc=%d. (2)\n", EventMultiSem, rc));263 AssertMsg(!rc, ("Failed to signal event sem %p, rc=%d. (2)\n", hEventMultiSem, rc)); 253 264 } 254 265 else … … 259 270 */ 260 271 int rc2 = pthread_mutex_unlock(&pThis->Mutex); 261 AssertMsg(!rc2, ("Failed to unlock event sem %p, rc=%d.\n", EventMultiSem, rc));272 AssertMsg(!rc2, ("Failed to unlock event sem %p, rc=%d.\n", hEventMultiSem, rc)); 262 273 if (rc) 263 274 return RTErrConvertFromErrno(rc); … … 269 280 270 281 271 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem)282 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem) 272 283 { 273 284 /* 274 285 * Validate input. 275 286 */ 276 struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;287 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem; 277 288 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 278 289 uint32_t u32 = pThis->u32State; … … 285 296 if (rc) 286 297 { 287 AssertMsgFailed(("Failed to lock event multi sem %p, rc=%d.\n", EventMultiSem, rc));298 AssertMsgFailed(("Failed to lock event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); 288 299 return RTErrConvertFromErrno(rc); 289 300 } … … 303 314 if (rc) 304 315 { 305 AssertMsgFailed(("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc));316 AssertMsgFailed(("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); 306 317 return RTErrConvertFromErrno(rc); 307 318 } … … 312 323 313 324 314 static int rtSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies, bool fAutoResume)325 static int rtSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies, bool fAutoResume) 315 326 { 316 327 PCRTLOCKVALSRCPOS pSrcPos = NULL; … … 319 330 * Validate input. 320 331 */ 321 struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;332 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem; 322 333 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 323 334 uint32_t u32 = pThis->u32State; … … 333 344 if (rc) 334 345 { 335 AssertMsgFailed(("Failed to lock event multi sem %p, rc=%d.\n", EventMultiSem, rc));346 AssertMsgFailed(("Failed to lock event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); 336 347 return RTErrConvertFromErrno(rc); 337 348 } … … 345 356 ASMAtomicDecU32(&pThis->cWaiters); 346 357 rc = pthread_mutex_unlock(&pThis->Mutex); 347 AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc)); NOREF(rc);358 AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); NOREF(rc); 348 359 return VINF_SUCCESS; 349 360 } … … 351 362 { 352 363 rc = pthread_mutex_unlock(&pThis->Mutex); 353 AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc)); NOREF(rc);364 AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); NOREF(rc); 354 365 return VERR_SEM_DESTROYED; 355 366 } … … 377 388 if (rc) 378 389 { 379 AssertMsgFailed(("Failed to wait on event multi sem %p, rc=%d.\n", EventMultiSem, rc));390 AssertMsgFailed(("Failed to wait on event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); 380 391 ASMAtomicDecU32(&pThis->cWaiters); 381 392 int rc2 = pthread_mutex_unlock(&pThis->Mutex); 382 AssertMsg(!rc2, ("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc2)); NOREF(rc2);393 AssertMsg(!rc2, ("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc2)); NOREF(rc2); 383 394 return RTErrConvertFromErrno(rc); 384 395 } … … 421 432 if (rc) 422 433 { 423 AssertMsg(rc == ETIMEDOUT, ("Failed to lock event multi sem %p, rc=%d.\n", EventMultiSem, rc));434 AssertMsg(rc == ETIMEDOUT, ("Failed to lock event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); 424 435 return RTErrConvertFromErrno(rc); 425 436 } … … 433 444 ASMAtomicDecU32(&pThis->cWaiters); 434 445 rc = pthread_mutex_unlock(&pThis->Mutex); 435 AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc)); NOREF(rc);446 AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); NOREF(rc); 436 447 return VINF_SUCCESS; 437 448 } … … 439 450 { 440 451 rc = pthread_mutex_unlock(&pThis->Mutex); 441 AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc)); NOREF(rc);452 AssertMsg(!rc, ("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); NOREF(rc); 442 453 return VERR_SEM_DESTROYED; 443 454 } … … 473 484 if (rc && (rc != EINTR || !fAutoResume)) /* according to SuS this function shall not return EINTR, but linux man page says differently. */ 474 485 { 475 AssertMsg(rc == ETIMEDOUT, ("Failed to wait on event multi sem %p, rc=%d.\n", EventMultiSem, rc));486 AssertMsg(rc == ETIMEDOUT, ("Failed to wait on event multi sem %p, rc=%d.\n", hEventMultiSem, rc)); 476 487 ASMAtomicDecU32(&pThis->cWaiters); 477 488 int rc2 = pthread_mutex_unlock(&pThis->Mutex); 478 AssertMsg(!rc2, ("Failed to unlock event multi sem %p, rc=%d.\n", EventMultiSem, rc2)); NOREF(rc2);489 AssertMsg(!rc2, ("Failed to unlock event multi sem %p, rc=%d.\n", hEventMultiSem, rc2)); NOREF(rc2); 479 490 return RTErrConvertFromErrno(rc); 480 491 } … … 484 495 485 496 486 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)487 { 488 int rc = rtSemEventMultiWait( EventMultiSem, cMillies, true);497 RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 498 { 499 int rc = rtSemEventMultiWait(hEventMultiSem, cMillies, true); 489 500 Assert(rc != VERR_INTERRUPTED); 490 501 return rc; … … 492 503 493 504 494 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies)495 { 496 return rtSemEventMultiWait( EventMultiSem, cMillies, false);505 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 506 { 507 return rtSemEventMultiWait(hEventMultiSem, cMillies, false); 497 508 } 498 509 -
trunk/src/VBox/Runtime/r3/win/semeventmulti-win.cpp
r25704 r25720 70 70 71 71 72 /* Undefine debug mappings. */ 73 #undef RTSemEventMultiWait 74 #undef RTSemEventMultiWaitNoResume 75 76 77 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI pEventMultiSem) 78 { 72 73 RTDECL(int) RTSemEventMultiCreate(PRTSEMEVENTMULTI phEventMultiSem) 74 { 75 return RTSemEventMultiCreateEx(phEventMultiSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, NULL); 76 } 77 78 79 RTDECL(int) RTSemEventMultiCreateEx(PRTSEMEVENTMULTI phEventMultiSem, uint32_t fFlags, RTLOCKVALCLASS hClass, 80 const char *pszNameFmt, ...) 81 { 82 AssertReturn(!(fFlags & ~RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), VERR_INVALID_PARAMETER); 83 79 84 struct RTSEMEVENTMULTIINTERNAL *pThis = (struct RTSEMEVENTMULTIINTERNAL *)RTMemAlloc(sizeof(*pThis)); 80 85 if (!pThis) … … 90 95 pThis->u32Magic = RTSEMEVENTMULTI_MAGIC; 91 96 #ifdef RTSEMEVENT_STRICT 92 RTLockValidatorRecSharedInit(&pThis->Signallers, 93 NIL_RTLOCKVALCLASS, RTLOCKVAL_SUB_CLASS_ANY, 94 pThis, true /*fSignaller*/, true /*fEnabled*/, "RTSemEvent"); 97 va_list va; 98 va_start(va, pszNameFmt); 99 RTLockValidatorRecSharedInitV(&pThis->Signallers, hClass, RTLOCKVAL_SUB_CLASS_ANY, pThis, 100 true /*fSignaller*/, !(fFlags & RTSEMEVENTMULTI_FLAGS_NO_LOCK_VAL), 101 pszNameFmt, va); 102 va_end(va); 95 103 pThis->fEverHadSignallers = false; 96 104 #endif 97 105 98 *p EventMultiSem = pThis;106 *phEventMultiSem = pThis; 99 107 return VINF_SUCCESS; 100 108 } … … 106 114 107 115 108 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI EventMultiSem)109 { 110 struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;116 RTDECL(int) RTSemEventMultiDestroy(RTSEMEVENTMULTI hEventMultiSem) 117 { 118 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem; 111 119 if (pThis == NIL_RTSEMEVENT) /* don't bitch */ 112 return V ERR_INVALID_HANDLE;120 return VINF_SUCCESS; 113 121 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 114 122 AssertReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, VERR_INVALID_HANDLE); … … 130 138 DWORD dwErr = GetLastError(); 131 139 rc = RTErrConvertFromWin32(dwErr); 132 AssertMsgFailed(("Destroy EventMultiSem %p failed, lasterr=%u (%Rrc)\n", pThis, dwErr, rc));140 AssertMsgFailed(("Destroy hEventMultiSem %p failed, lasterr=%u (%Rrc)\n", pThis, dwErr, rc)); 133 141 /* Leak it. */ 134 142 } … … 138 146 139 147 140 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI EventMultiSem)148 RTDECL(int) RTSemEventMultiSignal(RTSEMEVENTMULTI hEventMultiSem) 141 149 { 142 150 /* 143 151 * Validate input. 144 152 */ 145 struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;153 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem; 146 154 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 147 155 AssertReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, VERR_INVALID_HANDLE); … … 162 170 return VINF_SUCCESS; 163 171 DWORD dwErr = GetLastError(); 164 AssertMsgFailed(("Signaling EventMultiSem %p failed, lasterr=%d\n", pThis, dwErr));172 AssertMsgFailed(("Signaling hEventMultiSem %p failed, lasterr=%d\n", pThis, dwErr)); 165 173 return RTErrConvertFromWin32(dwErr); 166 174 } 167 175 168 176 169 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI EventMultiSem)177 RTDECL(int) RTSemEventMultiReset(RTSEMEVENTMULTI hEventMultiSem) 170 178 { 171 179 /* 172 180 * Validate input. 173 181 */ 174 struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;182 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem; 175 183 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 176 184 AssertReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, VERR_INVALID_HANDLE); … … 182 190 return VINF_SUCCESS; 183 191 DWORD dwErr = GetLastError(); 184 AssertMsgFailed(("Resetting EventMultiSem %p failed, lasterr=%d\n", pThis, dwErr));192 AssertMsgFailed(("Resetting hEventMultiSem %p failed, lasterr=%d\n", pThis, dwErr)); 185 193 return RTErrConvertFromWin32(dwErr); 186 194 } … … 201 209 { 202 210 int rc2 = RTErrConvertFromWin32(GetLastError()); 203 AssertMsgFailed(("Wait on EventMultiSem %p failed, rc=%d lasterr=%d\n", pThis, rc, GetLastError()));211 AssertMsgFailed(("Wait on hEventMultiSem %p failed, rc=%d lasterr=%d\n", pThis, rc, GetLastError())); 204 212 if (rc2) 205 213 return rc2; … … 212 220 213 221 214 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI EventMultiSem, unsigned cMillies) 222 #undef RTSemEventMultiWaitNoResume 223 RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, unsigned cMillies) 215 224 { 216 225 PCRTLOCKVALSRCPOS pSrcPos = NULL; … … 219 228 * Validate input. 220 229 */ 221 struct RTSEMEVENTMULTIINTERNAL *pThis = EventMultiSem;230 struct RTSEMEVENTMULTIINTERNAL *pThis = hEventMultiSem; 222 231 AssertPtrReturn(pThis, VERR_INVALID_HANDLE); 223 232 AssertReturn(pThis->u32Magic == RTSEMEVENTMULTI_MAGIC, VERR_INVALID_HANDLE);
Note:
See TracChangeset
for help on using the changeset viewer.