#define RDBSS_REF_TRACK_NETFOBX 0x00000008
#define RDBSS_REF_TRACK_NETFCB 0x00000010
#define RDBSS_REF_TRACK_SRVOPEN 0x00000020
+#define RX_PRINT_REF_TRACKING 0x40000000
extern ULONG RdbssReferenceTracingValue;
_In_ ULONG Line,
_In_ PVOID Instance);
+#define REF_TRACING_ON(TraceMask) (TraceMask & RdbssReferenceTracingValue)
+#define PRINT_REF_COUNT(TYPE, Count) \
+ if (REF_TRACING_ON( RDBSS_REF_TRACK_ ## TYPE) && \
+ (RdbssReferenceTracingValue & RX_PRINT_REF_TRACKING)) \
+ { \
+ DbgPrint("%ld\n", Count); \
+ }
+
#define RxReferenceSrvCall(SrvCall) \
RxpTrackReference(RDBSS_REF_TRACK_SRVCALL, __FILE__, __LINE__, SrvCall); \
RxReference(SrvCall)
RefCount = InterlockedDecrement((volatile long *)&Node->NodeReferenceCount);
ASSERT(RefCount >= 0);
- /* TODO: trace */
+ /* Trace refcount */
switch (NodeType)
{
case RDBSS_NTC_SRVCALL:
+ PRINT_REF_COUNT(SRVCALL, Node->NodeReferenceCount);
+ break;
+
case RDBSS_NTC_NETROOT:
+ PRINT_REF_COUNT(NETROOT, Node->NodeReferenceCount);
+ break;
+
case RDBSS_NTC_V_NETROOT:
+ PRINT_REF_COUNT(VNETROOT, Node->NodeReferenceCount);
+ break;
+
case RDBSS_NTC_SRVOPEN:
+ PRINT_REF_COUNT(SRVOPEN, Node->NodeReferenceCount);
+ break;
+
case RDBSS_NTC_FOBX:
- UNIMPLEMENTED;
+ PRINT_REF_COUNT(NETFOBX, Node->NodeReferenceCount);
break;
+
default:
ASSERT(FALSE);
break;
Node = (PNODE_TYPE_AND_SIZE)Instance;
InterlockedIncrement((volatile long *)&Node->NodeReferenceCount);
- /* And that's not implemented! (yay, we leak :-D) */
+ /* Trace refcount if asked */
switch (NodeType)
{
case RDBSS_NTC_SRVCALL:
+ PRINT_REF_COUNT(SRVCALL, Node->NodeReferenceCount);
+ break;
+
case RDBSS_NTC_NETROOT:
+ PRINT_REF_COUNT(NETROOT, Node->NodeReferenceCount);
+ break;
+
case RDBSS_NTC_V_NETROOT:
+ PRINT_REF_COUNT(VNETROOT, Node->NodeReferenceCount);
+ break;
+
case RDBSS_NTC_SRVOPEN:
+ PRINT_REF_COUNT(SRVOPEN, Node->NodeReferenceCount);
+ break;
+
case RDBSS_NTC_FOBX:
- UNIMPLEMENTED;
+ PRINT_REF_COUNT(NETFOBX, Node->NodeReferenceCount);
break;
+
default:
ASSERT(FALSE);
break;