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.
|
|
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000, Microsoft Corp. All rights reserved.
//
// FILE
//
// iaswin32.h
//
// SYNOPSIS
//
// Declares wrappers around a variety of Win32 objects.
//
// MODIFICATION HISTORY
//
// 02/10/2000 Original version.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef IASWIN32_H
#define IASWIN32_H
#if _MSC_VER >= 1000
#pragma once
#endif
///////////////////////////////////////////////////////////////////////////////
//
// CLASS
//
// CriticalSection
//
///////////////////////////////////////////////////////////////////////////////
class CriticalSection { public: CriticalSection() { if (!InitializeCriticalSectionAndSpinCount(&cs, 0x80001000)) { throw std::bad_alloc(); } }
~CriticalSection() { DeleteCriticalSection(&cs); }
void lock() throw () { EnterCriticalSection(&cs); }
void unlock() throw () { LeaveCriticalSection(&cs); }
bool tryLock() throw () { return TryEnterCriticalSection(&cs) != FALSE; }
private: CRITICAL_SECTION cs;
// Not implemented.
CriticalSection(const CriticalSection&); CriticalSection& operator=(const CriticalSection&); };
///////////////////////////////////////////////////////////////////////////////
//
// CLASS
//
// Event
//
///////////////////////////////////////////////////////////////////////////////
class Event { public: Event(BOOL manualReset = FALSE, BOOL initialState = FALSE) : h(CreateEvent(NULL, manualReset, initialState, NULL)) { if (!h) { throw std::bad_alloc(); } }
~Event() throw () { CloseHandle(h); }
void reset() throw () { ResetEvent(h); }
void set() throw () { SetEvent(h); }
void wait(ULONG msec = INFINITE) throw () { WaitForSingleObject(h, msec); }
operator HANDLE() throw () { return h; }
private: HANDLE h;
// Not implemented.
Event(const Event&); Event& operator=(const Event&); };
///////////////////////////////////////////////////////////////////////////////
//
// CLASS
//
// RWLock
//
// DESCRIPTION
//
// This class implements a RWLock synchronization object. Threads
// may request either exclusive or shared access to the protected area.
//
///////////////////////////////////////////////////////////////////////////////
class RWLock { public: RWLock(); ~RWLock() throw ();
void Lock() const throw (); void LockExclusive() throw (); void Unlock() const throw ();
protected: // Number of threads sharing the perimeter.
mutable LONG sharing;
// Number of threads waiting for shared access.
LONG waiting;
// Pointer to either sharing or waiting depending on the current state of
// the perimeter.
PLONG count;
// Synchronizes exclusive access.
mutable CRITICAL_SECTION exclusive;
// Wakes up threads waiting for shared access.
HANDLE sharedOK;
// Wakes up threads waiting for exclusive access.
HANDLE exclusiveOK;
private: // Not implemented.
RWLock(const RWLock&) throw (); RWLock& operator=(const RWLock&) throw (); };
///////////////////////////////////////////////////////////////////////////////
//
// CLASS
//
// Count
//
///////////////////////////////////////////////////////////////////////////////
class Count { public: Count() throw () : value(0) { }
Count(const Count& c) throw () : value(c) { }
Count& operator=(const Count& c) throw () { value = c.value; return *this; }
LONG operator=(LONG l) throw () { value = l; return value; }
LONG operator++() throw () { return InterlockedIncrement(&value); }
LONG operator--() throw () { return InterlockedDecrement(&value); }
operator LONG() const throw () { return value; }
private: LONG value; };
#endif // IASWIN32_H
|