--- a/kernel/eka/memmodel/epoc/flexible/mmu/mm.cpp Fri Mar 12 15:50:11 2010 +0200
+++ b/kernel/eka/memmodel/epoc/flexible/mmu/mm.cpp Mon Mar 15 12:45:50 2010 +0200
@@ -204,17 +204,18 @@
void DReferenceCountedObject::Open()
{
- __ASSERT_CRITICAL
- TBool ok = __e32_atomic_tas_ord32(&iReferenceCount, 1, 1, 0);
- __NK_ASSERT_ALWAYS(ok);
+ CHECK_PRECONDITIONS(MASK_NO_KILL_OR_SUSPEND, "DReferenceCountedObject::Open");
+ TInt orig = __e32_atomic_tas_ord32(&iReferenceCount, 1, 1, 0);
+ if (orig <= 0)
+ __crash();
}
TBool DReferenceCountedObject::TryOpen()
{
- __ASSERT_CRITICAL
- TBool ok = __e32_atomic_tas_ord32(&iReferenceCount, 1, 1, 0);
- return ok;
+ CHECK_PRECONDITIONS(MASK_NO_KILL_OR_SUSPEND, "DReferenceCountedObject::Open");
+ TInt orig = __e32_atomic_tas_ord32(&iReferenceCount, 1, 1, 0);
+ return (orig>0);
}
@@ -245,20 +246,23 @@
void DReferenceCountedObject::Close()
{
- __ASSERT_CRITICAL
__NK_ASSERT_DEBUG(CheckCloseIsSafe());
- __NK_ASSERT_DEBUG(iReferenceCount>0);
- if (__e32_atomic_tas_ord32(&iReferenceCount, 1, -1, 0) == 1)
+ TInt orig = __e32_atomic_tas_ord32(&iReferenceCount, 1, -1, 0);
+ if (orig == 1)
delete this;
+ else if (orig <= 0)
+ __crash();
}
void DReferenceCountedObject::AsyncClose()
{
- __ASSERT_CRITICAL
- __NK_ASSERT_DEBUG(iReferenceCount>0);
- if (__e32_atomic_tas_ord32(&iReferenceCount, 1, -1, 0) == 1)
+ CHECK_PRECONDITIONS(MASK_NO_KILL_OR_SUSPEND, "DReferenceCountedObject::AsyncClose");
+ TInt orig = __e32_atomic_tas_ord32(&iReferenceCount, 1, -1, 0);
+ if (orig == 1)
AsyncDelete();
+ else if (orig <= 0)
+ __crash();
}