|
|
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name: refcnt.h
Abstract: Reference counting for an object. Author: Scott Holden (sholden) 12/29/1998 Borrowed from IrDA. Revision History:
--*/
#ifndef _REFCNT_H_
#define _REFCNT_H_
#ifdef NDIS40 // Only used for NDIS40 code now.
#define TAG_CNT 8
#define REF_SIG 0x7841eeee
#if DBG
typedef struct _REF_TAG { ULONG Tag; LONG Count; } REF_TAG; #endif
typedef struct _REF_CNT { LONG Count; PVOID Instance; VOID (*DeleteHandler)(PVOID pvContext); #if DBG
int Sig; REF_TAG Tags[TAG_CNT]; KSPIN_LOCK Lock; ULONG TypeTag; #endif // DBG
} REF_CNT, *PREF_CNT;
//
// ReferenceInit - Initialize the reference control block.
//
_inline VOID ReferenceInit( IN PREF_CNT pRefCnt, PVOID InstanceHandle, VOID (*DeleteHandler)(PVOID pvContext) ) { pRefCnt->Count = 0; pRefCnt->Instance = InstanceHandle; pRefCnt->DeleteHandler = DeleteHandler; }
//
// ReferenceAdd - Add a reference.
//
_inline VOID ReferenceAdd( IN PREF_CNT pRefCnt ) { InterlockedIncrement(&pRefCnt->Count); }
//
// ReferenceRemove - Del a reference. If the reference is zero, and a
// delete handler has been specified, then call the
// handler.
//
_inline VOID ReferenceRemove( IN PREF_CNT pRefCnt ) { if (InterlockedDecrement(&pRefCnt->Count) <= 0 && pRefCnt->DeleteHandler) { (pRefCnt->DeleteHandler)(pRefCnt->Instance); } }
#if DBG
//
// For checked builds, we will do some verification with tags, etc to ensure
// that the ref counting is done correctly.
//
VOID ReferenceInitDbg( IN PREF_CNT pRefCnt, PVOID InstanceHandle, VOID (*DeleteHandler)(PVOID pvContext), ULONG TypeTag );
VOID ReferenceAddDbg( PREF_CNT pRefCnt, ULONG Tag, int cLine );
VOID ReferenceRemoveDbg( PREF_CNT pRefCnt, ULONG Tag, int cLine );
#define REFINIT(Rc, Inst, DelHandler, Tag) ReferenceInitDbg(Rc, Inst, DelHandler, Tag)
#define REFADD(Rc, Tag) ReferenceAddDbg(Rc, Tag, __LINE__)
#define REFDEL(Rc, Tag) ReferenceRemoveDbg(Rc, Tag, __LINE__)
#else // DBG
#define REFINIT(Rc, Inst, DelHandler, Tag) ReferenceInit(Rc, Inst, DelHandler)
#define REFADD(Rc, Tag) ReferenceAdd(Rc);
#define REFDEL(Rc, Tag) ReferenceRemove(Rc);
#endif // !DBG
#endif // NDIS40
#endif // _REFCNT_H_
|