Leaked source code of windows server 2003
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.
 
 
 
 
 
 

125 lines
2.6 KiB

//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
// ***************************************************************************
//
// Original Author: Rajesh Rao
//
// $Author: rajeshr $
// $Date: 6/11/98 4:43p $
// $Workfile:refcount.cpp $
//
// $Modtime: 6/11/98 11:21a $
// $Revision: 1 $
// $Nokeywords: $
//
//
// Description: Contains the imlementation for a basic reference counted object
//
//***************************************************************************
#include "precomp.h"
CRefCountedObject::CRefCountedObject() :
m_dwRefCount ( 1 ),
m_lpszName ( NULL ),
m_CreationTime ( 0 ),
m_LastAccessTime ( 0 )
{
// Initialize the critical section
InitializeCriticalSection(&m_ReferenceCountSection);
FILETIME fileTime;
GetSystemTimeAsFileTime(&fileTime);
LARGE_INTEGER creationTime;
memcpy((LPVOID)&creationTime, (LPVOID)&fileTime, sizeof LARGE_INTEGER);
m_CreationTime = creationTime.QuadPart;
m_LastAccessTime = creationTime.QuadPart;
}
CRefCountedObject::CRefCountedObject(LPCWSTR lpszName) :
m_dwRefCount ( 1 ),
m_lpszName ( NULL ),
m_CreationTime ( 0 ),
m_LastAccessTime ( 0 )
{
// Initialize the critical section
InitializeCriticalSection(&m_ReferenceCountSection);
if(lpszName)
{
try
{
m_lpszName = new WCHAR[wcslen(lpszName) + 1];
wcscpy(m_lpszName, lpszName);
}
catch ( ... )
{
if ( m_lpszName )
{
delete [] m_lpszName;
m_lpszName = NULL;
}
DeleteCriticalSection(&m_ReferenceCountSection);
throw;
}
}
FILETIME fileTime;
GetSystemTimeAsFileTime(&fileTime);
LARGE_INTEGER creationTime;
memcpy((LPVOID)&creationTime, (LPVOID)&fileTime, sizeof LARGE_INTEGER);
m_CreationTime = creationTime.QuadPart;
}
CRefCountedObject::~CRefCountedObject()
{
if (m_lpszName)
{
delete[] m_lpszName;
}
// Destroy the critical section
DeleteCriticalSection(&m_ReferenceCountSection);
}
void CRefCountedObject::AddRef()
{
EnterCriticalSection(&m_ReferenceCountSection);
m_dwRefCount ++;
LeaveCriticalSection(&m_ReferenceCountSection);
}
void CRefCountedObject::Release()
{
EnterCriticalSection(&m_ReferenceCountSection);
DWORD dwCount = --m_dwRefCount;
LeaveCriticalSection(&m_ReferenceCountSection);
if( dwCount == 0)
delete this;
}
LPCWSTR CRefCountedObject::GetName()
{
return m_lpszName;
}
void CRefCountedObject::SetName(LPCWSTR lpszName)
{
if (m_lpszName)
{
delete[] m_lpszName;
m_lpszName=NULL;
}
if(lpszName)
{
m_lpszName = new WCHAR[wcslen(lpszName) + 1];
wcscpy(m_lpszName, lpszName);
}
}