// Common, group WinWrap
// see CW Critical Sections
// Copyright Alexander Liss

#ifndef __CRITICAL_H__
#define __CRITICAL_H__

#include "win0.h"

class CriticalSection 
{
public:
    // creates a CRITICAL_SECTION
    CriticalSection();
    ~CriticalSection();

    void enter();
    void leave();

	#if(_WIN32_WINNT >= 0x0400)
	BOOL try_enter();
	#endif


    // A POINTER TO THE INTERNAL CRITICAL_SECTION
    CRITICAL_SECTION *get();

private:
    CRITICAL_SECTION critical_section;
};


class FunctionLock
{
FunctionLock(const FunctionLock&);
FunctionLock& operator=(const FunctionLock&);
public:

FunctionLock(CriticalSection& c):critical_section(c)
	{critical_section.enter();}

~FunctionLock(){critical_section.leave();}

private:

	CriticalSection & critical_section;
};



#endif