/*
 *
 * REVISIONS:
 *  cad09Jul93: Initial Revision
 *  pcy08Apr94: Trim size, use static iterators, dead code removal
 */


#ifndef __MUTEXLCK_H
#define __MUTEXLCK_H

#include "apcobj.h"


_CLASSDEF( MutexLock )

class MutexLock : public Obj {

protected:

public:
   MutexLock() {};

   virtual INT   Request() {return TimedRequest(-1L);};
   virtual INT   TimedRequest(LONG aMillisecondTimeOut) = 0;
   virtual INT   IsHeld() = 0;
   virtual INT   Release() = 0;
};


class AutoMutexLocker
{
public:
    AutoMutexLocker(MutexLock * aLock) 
        : theLock(aLock) 
    {
        if (theLock) {
            theLock->Request();
        }
    };

    //
    // the destructor is not declared virtual because this
    // class is not intended to be derived from - so there
    // is no need to add a Vtable when it isn't needed
    //
    ~AutoMutexLocker() 
    {
        if (theLock) {
            theLock->Release();
        }
    };

protected:
private:
    MutexLock * theLock;
};

#endif