Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

69 lines
2.4 KiB

#ifndef __REFTRCE2_H__
#define __REFTRCE2_H__
#if SERVICE_REF_TRACKING
# include <reftrace.h>
# define SHARED_LOG_REF_COUNT() \
( sm_pDbgRefTraceLog != NULL ) ? \
WriteRefTraceLog( \
sm_pDbgRefTraceLog \
, m_reference \
, this \
) \
: -1 \
//
// This macro logs the IIS_SERVICE-specific ref trace log
//
# define LOCAL_LOG_REF_COUNT() \
( m_pDbgRefTraceLog != NULL ) ? \
WriteRefTraceLog( \
m_pDbgRefTraceLog \
, m_reference \
, this \
) \
: -1 \
//
// Usage of above macros AFTER we decremented reference count
// was unsafe. Under stress we would sometimes hit assert
// in WriteTraceLog() because IIS_SERVICE::m_pDbgRefTraceLog
// was no longer valid. This was due to a race condition where
// another thread deletes IIS_SERVICE object while we are still
// doing the log.
// So, instead of using original macros AFTER the decrement
// use modified macros BEFORE the decrement. This should
// result in identical logs most of the time (subject to
// race conditions and our guessing of what post decrement
// reference count will be).
//
# define SHARED_EARLY_LOG_REF_COUNT() \
( sm_pDbgRefTraceLog != NULL ) ? \
WriteRefTraceLog( \
sm_pDbgRefTraceLog \
, m_reference - 1 \
, this \
) \
: -1 \
# define LOCAL_EARLY_LOG_REF_COUNT() \
( m_pDbgRefTraceLog != NULL ) ? \
WriteRefTraceLog( \
m_pDbgRefTraceLog \
, m_reference - 1 \
, this \
) \
: -1 \
#else // !SERVICE_REF_TRACKING
# define SHARED_LOG_REF_COUNT() (-1)
# define LOCAL_LOG_REF_COUNT() (-1)
# define SHARED_EARLY_LOG_REF_COUNT() (-1)
# define LOCAL_EARLY_LOG_REF_COUNT() (-1)
#endif // !SERVICE_REF_TRACKING
#endif // __REFTRCE2_H__