Source code of Windows XP (NT5)
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) 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
|