Changeset 25570 in vbox for trunk/src/VBox/Runtime/common
- Timestamp:
- Dec 22, 2009 3:11:13 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/misc/lockvalidator.cpp
r25567 r25570 159 159 pRec->hLock = hLock; 160 160 pRec->pszName = pszName; 161 pRec->pSibling = NULL; 161 162 162 163 /* Lazily initialize the crossroads semaphore. */ … … 197 198 ASMAtomicWriteHandle(&pRec->hThread, NIL_RTTHREAD); 198 199 ASMAtomicWriteHandle(&pRec->hClass, NIL_RTLOCKVALIDATORCLASS); 200 if (pRec->pSibling) 201 { 202 /* ASSUMES sibling destruction doesn't involve any races. */ 203 ASMAtomicUoWritePtr((void * volatile *)&pRec->pSibling->pSibling, NULL); 204 ASMAtomicUoWritePtr((void * volatile *)&pRec->pSibling, NULL); 205 } 199 206 200 207 rtLockValidatorSerializeDestructLeave(); … … 223 230 pRec->pszName = pszName; 224 231 pRec->fEnabled = RTLockValidatorIsEnabled(); 232 pRec->pSibling = NULL; 225 233 226 234 /* the table */ … … 232 240 pRec->afPadding[1] = false; 233 241 pRec->papOwners = NULL; 234 pRec->u64Alignment = UINT64_MAX; 242 #if HC_ARCH_BITS == 32 243 pRec->u32Alignment = UINT32_MAX; 244 #endif 235 245 } 236 246 … … 263 273 264 274 RTMemFree((void *)pRec->papOwners); 275 } 276 if (pRec->pSibling) 277 { 278 /* ASSUMES sibling destruction doesn't involve any races. */ 279 ASMAtomicUoWritePtr((void * volatile *)&pRec->pSibling->pSibling, NULL); 280 ASMAtomicUoWritePtr((void * volatile *)&pRec->pSibling, NULL); 265 281 } 266 282 ASMAtomicWriteBool(&pRec->fReallocating, false); … … 510 526 511 527 528 RTDECL(int) RTLockValidatorMakeSiblings(void *pvRec1, void *pvRec2) 529 { 530 /* 531 * Validate input. 532 */ 533 union 534 { 535 PRTLOCKVALIDATORREC pRec; 536 PRTLOCKVALIDATORSHARED pShared; 537 uint32_t *pu32Magic; 538 void *pv; 539 } u1, u2; 540 u1.pv = pvRec1; 541 u2.pv = pvRec2; 542 543 AssertPtrReturn(u1.pv, VERR_SEM_LV_INVALID_PARAMETER); 544 AssertReturn( *u1.pu32Magic == RTLOCKVALIDATORREC_MAGIC 545 || *u1.pu32Magic == RTLOCKVALIDATORSHARED_MAGIC 546 , VERR_SEM_LV_INVALID_PARAMETER); 547 548 AssertPtrReturn(u2.pv, VERR_SEM_LV_INVALID_PARAMETER); 549 AssertReturn( *u2.pu32Magic == RTLOCKVALIDATORREC_MAGIC 550 || *u2.pu32Magic == RTLOCKVALIDATORSHARED_MAGIC 551 , VERR_SEM_LV_INVALID_PARAMETER); 552 553 /* 554 * Link them. 555 */ 556 if ( *u1.pu32Magic == RTLOCKVALIDATORREC_MAGIC 557 && *u2.pu32Magic == RTLOCKVALIDATORSHARED_MAGIC) 558 { 559 u1.pRec->pSibling = u2.pShared; 560 u2.pShared->pSibling = u1.pRec; 561 } 562 else if ( *u1.pu32Magic == RTLOCKVALIDATORSHARED_MAGIC 563 && *u2.pu32Magic == RTLOCKVALIDATORREC_MAGIC) 564 { 565 u1.pShared->pSibling = u2.pRec; 566 u2.pRec->pSibling = u1.pShared; 567 } 568 else 569 AssertFailedReturn(VERR_SEM_LV_INVALID_PARAMETER); /* unsupported mix */ 570 571 return VINF_SUCCESS; 572 } 573 574 512 575 RTDECL(int) RTLockValidatorCheckOrder(PRTLOCKVALIDATORREC pRec, RTTHREAD hThread, PCRTLOCKVALIDATORSRCPOS pSrcPos) 513 576 { … … 860 923 case RTTHREADSTATE_FAST_MUTEX: 861 924 case RTTHREADSTATE_MUTEX: 862 case RTTHREADSTATE_RW_READ:863 case RTTHREADSTATE_RW_WRITE:864 925 case RTTHREADSTATE_SPIN_MUTEX: 865 926 { … … 889 950 } 890 951 952 #if 0 953 case RTTHREADSTATE_RW_READ: 954 case RTTHREADSTATE_RW_WRITE: 955 { 956 } 957 #endif 958 891 959 default: 892 960 RTAssertMsg2Weak(" Impossible!!! enmState=%s (%d)\n", RTThreadStateName(enmCurState), enmCurState); … … 1066 1134 case RTTHREADSTATE_FAST_MUTEX: 1067 1135 case RTTHREADSTATE_MUTEX: 1068 case RTTHREADSTATE_RW_WRITE:1069 1136 case RTTHREADSTATE_SPIN_MUTEX: 1070 1137 { … … 1082 1149 } 1083 1150 1151 #if 0 1152 case RTTHREADSTATE_RW_WRITE: 1153 { 1154 PRTLOCKVALIDATORREC pCurRec = pCur->LockValidator.pRec; 1155 if ( rtThreadGetState(pCur) != enmCurState 1156 || !VALID_PTR(pCurRec) 1157 || pCurRec->u32Magic != RTLOCKVALIDATORREC_MAGIC) 1158 continue; 1159 1160 break; 1161 } 1162 1084 1163 case RTTHREADSTATE_RW_READ: 1085 1164 { … … 1096 1175 break; 1097 1176 } 1098 1177 #endif 1099 1178 1100 1179 default:
Note:
See TracChangeset
for help on using the changeset viewer.