Changeset 25710 in vbox
- Timestamp:
- Jan 11, 2010 10:46:24 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 56447
- Location:
- trunk/src/VBox/Runtime
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/misc/lockvalidator.cpp
r25707 r25710 3046 3046 return VINF_SUCCESS; 3047 3047 AssertReturn(pRecU->Excl.hThread != NIL_RTTHREAD, VERR_SEM_LV_INVALID_PARAMETER); 3048 Assert(pRecU->Excl.hThread == RTThreadSelf()); 3048 3049 AssertReturn(pRecU->Excl.cRecursion > 1, VERR_SEM_LV_INVALID_PARAMETER); 3049 3050 3051 /* 3052 * Check the release order. 3053 */ 3054 if ( pRecU->Excl.hClass != NIL_RTLOCKVALCLASS 3055 && pRecU->Excl.hClass->fStrictReleaseOrder 3056 && pRecU->Excl.hClass->cMsMinOrder != RT_INDEFINITE_WAIT 3057 ) 3058 { 3059 int rc = rtLockValidatorStackCheckReleaseOrder(pRecU->Excl.hThread, pRecU); 3060 if (RT_FAILURE(rc)) 3061 return rc; 3062 } 3063 3064 /* 3065 * Perform the unwind. 3066 */ 3050 3067 pRecU->Excl.cRecursion--; 3051 3068 rtLockValidatorStackPopRecursion(pRecU->Excl.hThread, pRecU); … … 3064 3081 if (!pRecU->Excl.fEnabled) 3065 3082 return VINF_SUCCESS; 3083 Assert(pRecU->Excl.hThread == RTThreadSelf()); 3066 3084 AssertReturn(pRecU->Excl.hThread != NIL_RTTHREAD, VERR_SEM_LV_INVALID_PARAMETER); 3067 3085 AssertReturn(pRecU->Excl.cRecursion > 0, VERR_SEM_LV_INVALID_PARAMETER); … … 3094 3112 if (!pRecU->Excl.fEnabled) 3095 3113 return VINF_SUCCESS; 3114 Assert(pRecU->Excl.hThread == RTThreadSelf()); 3096 3115 AssertReturn(pRecU->Excl.hThread != NIL_RTTHREAD, VERR_SEM_LV_INVALID_PARAMETER); 3097 3116 AssertReturn(pRecU->Excl.cRecursion > 1, VERR_SEM_LV_INVALID_PARAMETER); 3098 3117 3118 /* 3119 * Check the release order. 3120 */ 3121 if ( pRecU->Excl.hClass != NIL_RTLOCKVALCLASS 3122 && pRecU->Excl.hClass->fStrictReleaseOrder 3123 && pRecU->Excl.hClass->cMsMinOrder != RT_INDEFINITE_WAIT 3124 ) 3125 { 3126 int rc = rtLockValidatorStackCheckReleaseOrder(pRecU->Excl.hThread, pRecU); 3127 if (RT_FAILURE(rc)) 3128 return rc; 3129 } 3130 3131 /* 3132 * Perform the unwind. 3133 */ 3099 3134 pRecU->Excl.cRecursion--; 3100 3135 rtLockValidatorStackPopRecursion(pRecU->Excl.hThread, pRecU); -
trunk/src/VBox/Runtime/generic/semrw-generic.cpp
r25707 r25710 121 121 if (RT_SUCCESS(rc)) 122 122 { 123 rc = RTCritSectInit (&pThis->CritSect);123 rc = RTCritSectInitEx(&pThis->CritSect, RTCRITSECT_FLAGS_NO_LOCK_VAL, NIL_RTLOCKVALCLASS, RTLOCKVAL_SUB_CLASS_NONE, NULL); 124 124 if (RT_SUCCESS(rc)) 125 125 { … … 142 142 va_list va; 143 143 va_start(va, pszNameFmt); 144 RTLockValidatorRecExclInit (&pThis->ValidatorWrite, hClass, uSubClass, pThis, fLVEnabled, pszNameFmt);144 RTLockValidatorRecExclInitV(&pThis->ValidatorWrite, hClass, uSubClass, pThis, fLVEnabled, pszNameFmt, va); 145 145 va_end(va); 146 146 va_start(va, pszNameFmt); 147 RTLockValidatorRecSharedInit (&pThis->ValidatorRead, hClass, uSubClass, pThis, false /*fSignaller*/,148 fLVEnabled, pszNameFmt);147 RTLockValidatorRecSharedInitV(&pThis->ValidatorRead, hClass, uSubClass, pThis, false /*fSignaller*/, 148 fLVEnabled, pszNameFmt, va); 149 149 va_end(va); 150 150 RTLockValidatorRecMakeSiblings(&pThis->ValidatorWrite.Core, &pThis->ValidatorRead.Core); … … 271 271 if (cMillies > 0) 272 272 { 273 int rc9 = RTLockValidatorRecSharedCheckOrder(&pThis->ValidatorRead, hThreadSelf, pSrcPos, cMillies); 273 int rc9; 274 if (pThis->hWriter != NIL_RTTHREAD && pThis->hWriter == RTThreadNativeSelf()) 275 rc9 = RTLockValidatorRecExclCheckOrder(&pThis->ValidatorWrite, hThreadSelf, pSrcPos, cMillies); 276 else 277 rc9 = RTLockValidatorRecSharedCheckOrder(&pThis->ValidatorRead, hThreadSelf, pSrcPos, cMillies); 274 278 if (RT_FAILURE(rc9)) 275 279 return rc9; -
trunk/src/VBox/Runtime/generic/semrw-lockless-generic.cpp
r25707 r25710 147 147 va_list va; 148 148 va_start(va, pszNameFmt); 149 RTLockValidatorRecExclInit (&pThis->ValidatorWrite, hClass, uSubClass, pThis, fLVEnabled, pszNameFmt);149 RTLockValidatorRecExclInitV(&pThis->ValidatorWrite, hClass, uSubClass, pThis, fLVEnabled, pszNameFmt, va); 150 150 va_end(va); 151 151 va_start(va, pszNameFmt); 152 RTLockValidatorRecSharedInit (&pThis->ValidatorRead, hClass, uSubClass, pThis, false /*fSignaller*/,153 fLVEnabled, pszNameFmt);152 RTLockValidatorRecSharedInitV(&pThis->ValidatorRead, hClass, uSubClass, pThis, false /*fSignaller*/, 153 fLVEnabled, pszNameFmt, va); 154 154 va_end(va); 155 155 RTLockValidatorRecMakeSiblings(&pThis->ValidatorWrite.Core, &pThis->ValidatorRead.Core); … … 237 237 if (cMillies > 0) 238 238 { 239 int rc9 = RTLockValidatorRecSharedCheckOrder(&pThis->ValidatorRead, hThreadSelf, pSrcPos, cMillies); 239 int rc9; 240 RTNATIVETHREAD hNativeWriter; 241 ASMAtomicUoReadHandle(&pThis->hNativeWriter, &hNativeWriter); 242 if (hNativeWriter != NIL_RTTHREAD && hNativeWriter == RTThreadNativeSelf()) 243 rc9 = RTLockValidatorRecExclCheckOrder(&pThis->ValidatorWrite, hThreadSelf, pSrcPos, cMillies); 244 else 245 rc9 = RTLockValidatorRecSharedCheckOrder(&pThis->ValidatorRead, hThreadSelf, pSrcPos, cMillies); 240 246 if (RT_FAILURE(rc9)) 241 247 return rc9; -
trunk/src/VBox/Runtime/r3/posix/semrw-posix.cpp
r25707 r25710 132 132 va_list va; 133 133 va_start(va, pszNameFmt); 134 RTLockValidatorRecExclInit (&pThis->ValidatorWrite, hClass, uSubClass, pThis, fLVEnabled, pszNameFmt);134 RTLockValidatorRecExclInitV(&pThis->ValidatorWrite, hClass, uSubClass, pThis, fLVEnabled, pszNameFmt, va); 135 135 va_end(va); 136 136 va_start(va, pszNameFmt); 137 RTLockValidatorRecSharedInit (&pThis->ValidatorRead, hClass, uSubClass, pThis, false /*fSignaller*/,138 fLVEnabled, pszNameFmt);137 RTLockValidatorRecSharedInitV(&pThis->ValidatorRead, hClass, uSubClass, pThis, false /*fSignaller*/, 138 fLVEnabled, pszNameFmt, va); 139 139 va_end(va); 140 140 RTLockValidatorRecMakeSiblings(&pThis->ValidatorWrite.Core, &pThis->ValidatorRead.Core); … … 581 581 return VINF_SUCCESS; 582 582 } 583 pThis->cWrites--;584 583 585 584 /* … … 592 591 #endif 593 592 593 pThis->cWrites--; 594 594 ATOMIC_SET_PTHREAD_T(&pThis->Writer, (pthread_t)-1); 595 595 int rc = pthread_rwlock_unlock(&pThis->RWLock); -
trunk/src/VBox/Runtime/testcase/tstRTLockValidator.cpp
r25707 r25710 1045 1045 this as a valid lock order. */ 1046 1046 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestWrite(g_ahSemRWs[0], RT_INDEFINITE_WAIT), VINF_SUCCESS); 1047 RTTEST_CHECK_RC(g_hTest, RTSemRWRequest Write(g_ahSemRWs[1], RT_INDEFINITE_WAIT), VINF_SUCCESS);1047 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestRead( g_ahSemRWs[1], RT_INDEFINITE_WAIT), VINF_SUCCESS); 1048 1048 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestRead( g_ahSemRWs[2], RT_INDEFINITE_WAIT), VINF_SUCCESS); 1049 1049 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestWrite(g_ahSemRWs[3], RT_INDEFINITE_WAIT), VINF_SUCCESS); … … 1055 1055 int rc; 1056 1056 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[0]), VINF_SUCCESS); 1057 RTTEST_CHECK_RC(g_hTest, rc = RTSemRWRe leaseWrite(g_ahSemRWs[0]), VERR_SEM_LV_WRONG_ORDER);1057 RTTEST_CHECK_RC(g_hTest, rc = RTSemRWRequestWrite(g_ahSemRWs[0], RT_INDEFINITE_WAIT), VERR_SEM_LV_WRONG_ORDER); 1058 1058 if (RT_SUCCESS(rc)) 1059 1059 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[0]), VINF_SUCCESS); 1060 1060 1061 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead(g_ahSemRWs[1]), VINF_SUCCESS); 1062 RTTEST_CHECK_RC(g_hTest, rc = RTSemRWRequestRead(g_ahSemRWs[1], RT_INDEFINITE_WAIT), VERR_SEM_LV_WRONG_ORDER); 1063 if (RT_SUCCESS(rc)) 1064 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead(g_ahSemRWs[1]), VINF_SUCCESS); 1065 1061 1066 /* Check that recursion isn't subject to order checks. */ 1062 RTTEST_CHECK_RC(g_hTest, rc = RTSemRWReleaseWrite(g_ahSemRWs[1]), VINF_SUCCESS); 1063 if (RT_SUCCESS(rc)) 1064 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[1]), VINF_SUCCESS); 1067 RTTEST_CHECK_RC(g_hTest, rc = RTSemRWRequestRead(g_ahSemRWs[2], RT_INDEFINITE_WAIT), VINF_SUCCESS); 1068 if (RT_SUCCESS(rc)) 1069 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead(g_ahSemRWs[2]), VINF_SUCCESS); 1070 RTTEST_CHECK(g_hTest, RTSemRWGetReadCount(g_ahSemRWs[2]) == 1); 1071 1072 RTTEST_CHECK_RC(g_hTest, rc = RTSemRWRequestWrite(g_ahSemRWs[3], RT_INDEFINITE_WAIT), VINF_SUCCESS); 1073 if (RT_SUCCESS(rc)) 1074 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[3]), VINF_SUCCESS); 1075 RTTEST_CHECK(g_hTest, RTSemRWGetWriteRecursion(g_ahSemRWs[3]) == 1); 1065 1076 1066 1077 /* Enable strict release order for class 2 and 3, then check that violations … … 1068 1079 RTTEST_CHECK_RC(g_hTest, RTLockValidatorClassEnforceStrictReleaseOrder(g_ahClasses[2], true), VINF_SUCCESS); 1069 1080 RTTEST_CHECK_RC(g_hTest, RTLockValidatorClassEnforceStrictReleaseOrder(g_ahClasses[3], true), VINF_SUCCESS); 1070 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead(g_ahSemRWs[2]), VINF_SUCCESS); /* start recursion */ 1071 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[3]), VINF_SUCCESS); 1072 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[4]), VINF_SUCCESS); 1081 1082 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestRead( g_ahSemRWs[2], RT_INDEFINITE_WAIT), VINF_SUCCESS); /* start recursion */ 1083 RTTEST_CHECK( g_hTest, RTSemRWGetReadCount(g_ahSemRWs[2]) == 2); 1084 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestWrite(g_ahSemRWs[3], RT_INDEFINITE_WAIT), VINF_SUCCESS); 1085 RTTEST_CHECK( g_hTest, RTSemRWGetWriteRecursion(g_ahSemRWs[3]) == 2); 1086 RTTEST_CHECK_RC(g_hTest, RTSemRWRequestRead( g_ahSemRWs[4], RT_INDEFINITE_WAIT), VINF_SUCCESS); /* (mixed) */ 1087 1073 1088 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead( g_ahSemRWs[2]), VERR_SEM_LV_WRONG_RELEASE_ORDER); 1074 1089 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[3]), VERR_SEM_LV_WRONG_RELEASE_ORDER); 1090 RTTEST_CHECK( g_hTest, RTSemRWGetWriteRecursion(g_ahSemRWs[3]) == 2); 1091 RTTEST_CHECK( g_hTest, RTSemRWGetReadCount(g_ahSemRWs[2]) == 2); 1092 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead( g_ahSemRWs[4]), VINF_SUCCESS); 1093 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[3]), VINF_SUCCESS); 1094 RTTEST_CHECK( g_hTest, RTSemRWGetWriteRecursion(g_ahSemRWs[3]) == 1); 1095 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead( g_ahSemRWs[2]), VINF_SUCCESS); /* end recursion */ 1096 RTTEST_CHECK( g_hTest, RTSemRWGetReadCount(g_ahSemRWs[2]) == 1); 1097 1098 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead( g_ahSemRWs[2]), VERR_SEM_LV_WRONG_RELEASE_ORDER); 1099 RTTEST_CHECK(g_hTest, RTSemRWGetReadCount(g_ahSemRWs[2]) == 1); 1100 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[3]), VERR_SEM_LV_WRONG_RELEASE_ORDER); 1101 RTTEST_CHECK(g_hTest, RTSemRWGetWriteRecursion(g_ahSemRWs[3]) == 1); 1102 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[5]), VINF_SUCCESS); 1075 1103 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[4]), VINF_SUCCESS); 1076 1104 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[3]), VINF_SUCCESS); 1077 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead( g_ahSemRWs[2]), VINF_SUCCESS); /* end recursion */1078 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead( g_ahSemRWs[2]), VERR_SEM_LV_WRONG_RELEASE_ORDER);1079 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead( g_ahSemRWs[3]), VERR_SEM_LV_WRONG_RELEASE_ORDER);1080 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[1]), VINF_SUCCESS);1081 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[4]), VINF_SUCCESS);1082 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseWrite(g_ahSemRWs[5]), VINF_SUCCESS);1083 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead( g_ahSemRWs[3]), VINF_SUCCESS);1084 1105 RTTEST_CHECK_RC(g_hTest, RTSemRWReleaseRead( g_ahSemRWs[2]), VINF_SUCCESS); 1085 1106 … … 1187 1208 testLo1(); 1188 1209 testLo2(); 1210 testLo3(); 1189 1211 } 1190 1212
Note:
See TracChangeset
for help on using the changeset viewer.