equal
deleted
inserted
replaced
241 #endif |
241 #endif |
242 return true; |
242 return true; |
243 } |
243 } |
244 |
244 |
245 |
245 |
246 TBool DReferenceCountedObject::CheckAsyncCloseIsSafe() |
|
247 { |
|
248 __ASSERT_CRITICAL |
|
249 #ifdef _DEBUG |
|
250 NFastMutex* fm = NKern::HeldFastMutex(); |
|
251 if(fm) |
|
252 { |
|
253 Kern::Printf("DReferenceCountedObject[0x%08x]::AsyncClose() fast mutex violation %M",this,fm); |
|
254 return false; |
|
255 } |
|
256 #endif |
|
257 return true; |
|
258 } |
|
259 |
|
260 |
|
261 void DReferenceCountedObject::Close() |
246 void DReferenceCountedObject::Close() |
262 { |
247 { |
263 __ASSERT_CRITICAL |
248 __ASSERT_CRITICAL |
264 __NK_ASSERT_DEBUG(CheckCloseIsSafe()); |
249 __NK_ASSERT_DEBUG(CheckCloseIsSafe()); |
265 __NK_ASSERT_DEBUG(iReferenceCount>0); |
250 __NK_ASSERT_DEBUG(iReferenceCount>0); |
269 |
254 |
270 |
255 |
271 void DReferenceCountedObject::AsyncClose() |
256 void DReferenceCountedObject::AsyncClose() |
272 { |
257 { |
273 __ASSERT_CRITICAL |
258 __ASSERT_CRITICAL |
274 __NK_ASSERT_DEBUG(CheckAsyncCloseIsSafe()); |
|
275 __NK_ASSERT_DEBUG(iReferenceCount>0); |
259 __NK_ASSERT_DEBUG(iReferenceCount>0); |
276 if (__e32_atomic_tas_ord32(&iReferenceCount, 1, -1, 0) == 1) |
260 if (__e32_atomic_tas_ord32(&iReferenceCount, 1, -1, 0) == 1) |
277 AsyncDelete(); |
261 AsyncDelete(); |
278 } |
262 } |
279 |
263 |