177 lines
3.8 KiB
C++
177 lines
3.8 KiB
C++
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
soid.hxx
|
|
|
|
Abstract:
|
|
|
|
CServerOid objects represent OIDs belonging to processes on the local machine.
|
|
A COid's are reference counted by CServerSets which periodically check if the
|
|
process is still running.
|
|
|
|
Author:
|
|
|
|
Mario Goertzel [MarioGo]
|
|
|
|
Revision History:
|
|
|
|
MarioGo 02-22-95 Bits 'n pieces
|
|
MarioGo 04-04-95 Split client and server.
|
|
|
|
--*/
|
|
|
|
#ifndef __SOID_HXX
|
|
#define __SOID_HXX
|
|
|
|
|
|
class CServerOidPList : public CPList
|
|
{
|
|
public:
|
|
CServerOidPList(ORSTATUS &status) : CPList(status) {}
|
|
|
|
CServerOid *
|
|
MaybeRemoveMatchingOxid(CTime &when,
|
|
CServerOid *pOid);
|
|
|
|
};
|
|
|
|
class CServerOid : public CIdTableElement
|
|
/*++
|
|
|
|
Class Description:
|
|
|
|
Each instance of this class represents an OID registered
|
|
by a server on this machine. If this OID is not pinged
|
|
by a client for a timeout period it is rundown.
|
|
|
|
Members:
|
|
|
|
_pOxid - A pointer to the OXID which registered this OID.
|
|
We own a reference.
|
|
|
|
_plist - A CPListElement used to manage OID which are not
|
|
part of a client set. The worker thread uses this
|
|
CPList to manage the rundown on unpinged OIDs.
|
|
|
|
_list - A CListElement used to track pinned OIDs.
|
|
|
|
_fRunningDown - Flag used to prevent multiple threads
|
|
from trying to rundown the same OID multiple times.
|
|
Only 1 bit is required.
|
|
|
|
_fFreed - Flag used to remember when the owning apartment has
|
|
deregistered this oid.
|
|
|
|
_fPinned -- TRUE if we received a ORS_OID_PINNED status the last
|
|
time we tried to rundown this stub.
|
|
|
|
--*/
|
|
{
|
|
private :
|
|
|
|
CServerOxid *_pOxid;
|
|
CPListElement _plist;
|
|
CListElement _list;
|
|
BOOL _fRunningDown:1;
|
|
BOOL _fFreed:1;
|
|
BOOL _fPinned:1;
|
|
|
|
public :
|
|
|
|
CServerOid(CServerOxid *oxid) :
|
|
CIdTableElement(AllocateId()),
|
|
_pOxid(oxid),
|
|
_fRunningDown(FALSE),
|
|
_fFreed(FALSE),
|
|
_fPinned(FALSE)
|
|
{
|
|
_pOxid->Reference();
|
|
}
|
|
|
|
~CServerOid();
|
|
|
|
void KeepAlive();
|
|
|
|
void SetRundown(BOOL fRunningDown)
|
|
{
|
|
ASSERT(gpServerLock->HeldExclusive());
|
|
ASSERT(_plist.NotInList());
|
|
_fRunningDown = fRunningDown;
|
|
}
|
|
|
|
BOOL Match(CServerOid *pOid)
|
|
{
|
|
return(pOid->_pOxid == _pOxid);
|
|
}
|
|
|
|
BOOL IsRunning()
|
|
{
|
|
ASSERT(_pOxid);
|
|
return(_pOxid->IsRunning());
|
|
}
|
|
|
|
BOOL IsRunningDown()
|
|
{
|
|
return(_fRunningDown);
|
|
}
|
|
|
|
CServerOxid *GetOxid()
|
|
{
|
|
return(_pOxid);
|
|
}
|
|
|
|
void Reference();
|
|
|
|
DWORD Release();
|
|
|
|
static CServerOid *ContainingRecord(CListElement *ple) {
|
|
return CONTAINING_RECORD(ple, CServerOid, _plist);
|
|
}
|
|
|
|
static CServerOid *ContainingRecord2(CListElement *ple) {
|
|
return CONTAINING_RECORD(ple, CServerOid, _list);
|
|
}
|
|
|
|
void Insert() {
|
|
ASSERT(gpServerLock->HeldExclusive());
|
|
ASSERT(IsRunningDown() == FALSE);
|
|
ASSERT(_plist.NotInList());
|
|
ASSERT(_list.NotInList());
|
|
gpServerOidPList->Insert(&_plist);
|
|
}
|
|
|
|
CPListElement *Remove() {
|
|
ASSERT(gpServerLock->HeldExclusive());
|
|
// We may or may not be in the oid plist, so don't
|
|
// assert on that.
|
|
ASSERT(_list.NotInList());
|
|
return(gpServerOidPList->Remove(&_plist));
|
|
}
|
|
|
|
void Free() {
|
|
ASSERT(gpServerLock->HeldExclusive());
|
|
_fFreed = TRUE;
|
|
|
|
// If pinned, unpin.
|
|
if (IsPinned())
|
|
SetPinned(FALSE);
|
|
}
|
|
|
|
BOOL IsFreed() {
|
|
return(_fFreed);
|
|
}
|
|
|
|
void SetPinned(BOOL fPinned);
|
|
|
|
BOOL IsPinned() {
|
|
return (_fPinned);
|
|
}
|
|
|
|
};
|
|
|
|
#endif // __SOID_HXX
|
|
|