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) 1997-1999 Microsoft Corporation
//
// DLL object instance and server lock utility class
//
// 8-19-97 sburns
// concept stolen from DavidMun, who stole it from RaviR, who ...
#ifndef __DLLREF_HPP_INCLUDED
#define __DLLREF_HPP_INCLUDED
// Maintains a instance counter and lock counter, with methods to manipulate
// both in a thread-safe fashion. This is useful in implementing
// DllCanUnloadNow.
//
// Each class that is instanciated and passed outside of the control of the
// DLL should contain an instance of ComServerReference. This will automatically
// increment and decrement the ComServerLockState instance counter in step with the
// instance's lifetime. Typically, this includes all class factory instances,
// and instances of classes that are created by those class factories.
//
// Calls to a class factory's LockServer method should be deferred to
// this class.
//
// Calls to DllCanUnloadNow should defer to this class' CanUnloadNow method.
class ComServerLockState { public:
static void IncrementInstanceCounter() { ::InterlockedIncrement(&instanceCount); }
static void DecrementInstanceCounter() { ::InterlockedDecrement(&instanceCount); }
static void LockServer(bool lock) { lock ? ::InterlockedIncrement(&lockCount) : ::InterlockedDecrement(&lockCount); }
static bool CanUnloadNow() { return (instanceCount == 0 && lockCount == 0) ? true : false; }
private:
static long instanceCount; static long lockCount;
// not implemented
ComServerLockState(); ComServerLockState(const ComServerLockState&); const ComServerLockState& operator=(const ComServerLockState&); };
class ComServerReference { public:
ComServerReference() { ComServerLockState::IncrementInstanceCounter(); }
~ComServerReference() { ComServerLockState::DecrementInstanceCounter(); }
private:
// not implemented; no instance copying allowed.
ComServerReference(const ComServerReference&); const ComServerReference& operator=(const ComServerReference&); };
#endif // __DLLREF_HPP_INCLUDED
|