kernel/eka/memmodel/epoc/flexible/mmu/mm.cpp
branchRCL_3
changeset 21 e7d2d738d3c2
parent 20 597aaf25e343
child 22 2f92ad2dc5db
equal deleted inserted replaced
20:597aaf25e343 21:e7d2d738d3c2
   202 	}
   202 	}
   203 
   203 
   204 
   204 
   205 void DReferenceCountedObject::Open()
   205 void DReferenceCountedObject::Open()
   206 	{
   206 	{
   207 	__ASSERT_CRITICAL
   207 	CHECK_PRECONDITIONS(MASK_NO_KILL_OR_SUSPEND, "DReferenceCountedObject::Open");
   208 	TBool ok = __e32_atomic_tas_ord32(&iReferenceCount, 1, 1, 0);
   208 	TInt orig = __e32_atomic_tas_ord32(&iReferenceCount, 1, 1, 0);
   209 	__NK_ASSERT_ALWAYS(ok);
   209 	if (orig <= 0)
       
   210 		__crash();
   210 	}
   211 	}
   211 
   212 
   212 
   213 
   213 TBool DReferenceCountedObject::TryOpen()
   214 TBool DReferenceCountedObject::TryOpen()
   214 	{
   215 	{
   215 	__ASSERT_CRITICAL
   216 	CHECK_PRECONDITIONS(MASK_NO_KILL_OR_SUSPEND, "DReferenceCountedObject::Open");
   216 	TBool ok = __e32_atomic_tas_ord32(&iReferenceCount, 1, 1, 0);
   217 	TInt orig = __e32_atomic_tas_ord32(&iReferenceCount, 1, 1, 0);
   217 	return ok;
   218 	return (orig>0);
   218 	}
   219 	}
   219 
   220 
   220 
   221 
   221 TBool DReferenceCountedObject::CheckCloseIsSafe()
   222 TBool DReferenceCountedObject::CheckCloseIsSafe()
   222 	{
   223 	{
   243 	}
   244 	}
   244 
   245 
   245 
   246 
   246 void DReferenceCountedObject::Close()
   247 void DReferenceCountedObject::Close()
   247 	{
   248 	{
   248 	__ASSERT_CRITICAL
       
   249 	__NK_ASSERT_DEBUG(CheckCloseIsSafe());
   249 	__NK_ASSERT_DEBUG(CheckCloseIsSafe());
   250 	__NK_ASSERT_DEBUG(iReferenceCount>0);
   250 	TInt orig = __e32_atomic_tas_ord32(&iReferenceCount, 1, -1, 0);
   251 	if (__e32_atomic_tas_ord32(&iReferenceCount, 1, -1, 0) == 1)
   251 	if (orig == 1)
   252 		delete this;
   252 		delete this;
       
   253 	else if (orig <= 0)
       
   254 		__crash();
   253 	}
   255 	}
   254 
   256 
   255 
   257 
   256 void DReferenceCountedObject::AsyncClose()
   258 void DReferenceCountedObject::AsyncClose()
   257 	{
   259 	{
   258 	__ASSERT_CRITICAL
   260 	CHECK_PRECONDITIONS(MASK_NO_KILL_OR_SUSPEND, "DReferenceCountedObject::AsyncClose");
   259 	__NK_ASSERT_DEBUG(iReferenceCount>0);
   261 	TInt orig = __e32_atomic_tas_ord32(&iReferenceCount, 1, -1, 0);
   260 	if (__e32_atomic_tas_ord32(&iReferenceCount, 1, -1, 0) == 1)
   262 	if (orig == 1)
   261 		AsyncDelete();
   263 		AsyncDelete();
       
   264 	else if (orig <= 0)
       
   265 		__crash();
   262 	}
   266 	}
   263 
   267 
   264 
   268 
   265 //
   269 //
   266 // Memory object functions
   270 // Memory object functions