#ifndef __ZAutoCriticalSection_h__
#define __ZAutoCriticalSection_h__

/////////////////////////////////////////////////////////////////////////////
// ZAutoCriticalSection.h | Declaration of the ZAutoCriticalSection class.
//


/////////////////////////////////////////////////////////////////////////////
// ZAutoCriticalSection provides methods for obtaining and releasing
// ownership of a Win32 critical section object. ZAutoCriticalSection
// automatically initializes critical section objects in the constructor, and
// automatically deletes the critical section in the destructor.
class ZAutoCriticalSection
{
// Construction / Destruction
public:
  ZAutoCriticalSection();
  ~ZAutoCriticalSection();

// Operations
public:
  void Lock();
  void Unlock();

// Data Members
protected:
  CRITICAL_SECTION m_sec;  // A Win32 CRITICAL_SECTION object.
};


/////////////////////////////////////////////////////////////////////////////
// Group=Construction / Destruction

/////////////////////////////////////////////////////////////////////////////
// Description: Constructor.
//
// The constructor. Calls the Win32 function InitializeCriticalSection,
// which initializes the critical section object contained in the m_sec data
// member.
//
// See Also: ZAutoCriticalSection::Lock, ZAutoCriticalSection::destructor
inline ZAutoCriticalSection::ZAutoCriticalSection()
{
  InitializeCriticalSection(&m_sec);
}

/////////////////////////////////////////////////////////////////////////////
// Description: Destructor
//
// The destructor. calls DeleteCriticalSection, which releases all system
// resources used by the critical section object.
//
// See Also: ZAutoCriticalSection::Unlock,
// ZAutoCriticalSection::constructor
inline ZAutoCriticalSection::~ZAutoCriticalSection()
{
  DeleteCriticalSection(&m_sec);
}


/////////////////////////////////////////////////////////////////////////////
// Group=Operations

/////////////////////////////////////////////////////////////////////////////
// Obtains ownership of the critical section object.
//
// See Also: ZAutoCriticalSection::Unlock, ZAutoCriticalSection::destructor
inline void ZAutoCriticalSection::Lock()
{
  EnterCriticalSection(&m_sec);
}

/////////////////////////////////////////////////////////////////////////////
// Releases ownership of the critical section object.
//
// See Also: ZAutoCriticalSection::Lock, ZAutoCriticalSection::constructor
inline void ZAutoCriticalSection::Unlock()
{
  LeaveCriticalSection(&m_sec);
}


/////////////////////////////////////////////////////////////////////////////

#endif // !__ZAutoCriticalSection_h__