|
|
/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
wanarp2\ref.h
Abstract:
Generic structure referencing routines All these routines assume that the structure has the following field:
LONG lRefCount
setting REF_DEBUG to 1 results in noisy output about when a structure is referenced and derefenced
Revision History:
Amritansh Raghav
--*/
#if REF_DEBUG
#define InitStructureRefCount(s, p, r) \
{ \ DbgPrint("\n<>%s refcount set to %d for %x (%s, %d)\n\n", \ s, (r), (p), __FILE__, __LINE__); \ (p)->lRefCount = r; \ }
#define ReferenceStructure(s, p) \
{ \ DbgPrint("\n++Ref %s %x to %d (%s, %d)\n\n", \ s, p, InterlockedIncrement(&((p)->lRefCount)), \ __FILE__, __LINE__); \ }
#define DereferenceStructure(s, p, f) \
{ \ LONG __lTemp; \ __lTemp = InterlockedDecrement(&((p)->lRefCount)); \ DbgPrint("\n--Deref %s %x to %d (%s, %d)\n\n", \ s, (p), __lTemp, __FILE__, __LINE__); \ if(__lTemp == 0) \ { \ DbgPrint("\n>< Deleting %s at %x\n\n", \ s, (p)); \ (f)((p)); \ } \ }
#else // REF_DEBUG
#define InitStructureRefCount(s, p, r) \
(p)->lRefCount = (r)
#define ReferenceStructure(s, p) \
InterlockedIncrement(&((p)->lRefCount))
#define DereferenceStructure(s, p, f) \
{ \ if(InterlockedDecrement(&((p)->lRefCount)) == 0) \ { \ (f)((p)); \ } \ }
#endif // REF_DEBUG
|