diff -r 000000000000 -r a41df078684a kernel/eka/memmodel/epoc/flexible/mmu/mrefcntobj.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kernel/eka/memmodel/epoc/flexible/mmu/mrefcntobj.h Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,120 @@ +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +/** + @file + @internalComponent +*/ + +#ifndef MREFCNTOBJ_H +#define MREFCNTOBJ_H + +#include + +/** +Base class for creating reference counted objects. + +This provide basic reference counting and asynchronous cleanup +for derived classes. An object whose reference count reaches zero +will be destroyed. +*/ +class DReferenceCountedObject : public DBase + { +public: + /** + Constructs this object with an initial reference count of one. + */ + DReferenceCountedObject(); + + /** + Atomically increment this object's reference count. + A fault is raised if the count was initially <= 0. + + @pre Calling thread must be in a critical section + @pre #iReferenceCount>0 + */ + void Open(); + + /** + Atomically increment this object's reference count if it + was initially > 0. + + This is for use in situations where a reference counted object + is found by looking in a list, and the list may contain + objects which have had their reference counts decremented + to zero and are in the process of being cleaned up. A failure + to open a reference on these objects should be taken as an + indication that the object should be ignored, and treated as + though it were never found. + + @return True if the count was incremented. + False if it wasn't: because it was initially <= 0. + + @pre Calling thread must be in a critical section + */ + TBool TryOpen(); + + /** + Decrement this object's reference count and if it reaches zero, + delete this object. + + @pre Calling thread must be in a critical section. + @pre No fast mutex can be held. + @pre No mutexes with order greater less than KMutexOrdKernelHeap can be held. + */ + void Close(); + + /** + Decrement this object's reference count and if this reaches zero, + queue this object for asynchronous deletion. + + @pre Calling thread must be in a critical section. + @pre No fast mutex can be held. + */ + void AsyncClose(); + +protected: + /** + Destructor which asserts in debug builds that the object's reference count is zero. + */ + virtual ~DReferenceCountedObject(); + + /** + Return true if the preconditions for #Close are met. + This is for use by derived classes which overload the #Close method. + */ + TBool CheckCloseIsSafe(); + + /** + Return true if the preconditions for #AsyncClose are met. + This is for use by derived classes which overload the #AsyncClose method. + */ + TBool CheckAsyncCloseIsSafe(); + +protected: + + /** + This object's reference count. Must always be >= 0. + */ + TInt iReferenceCount; + }; + + +FORCE_INLINE DReferenceCountedObject::DReferenceCountedObject() + : iReferenceCount(1) + { + } + +#endif