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:
coid.hxx
Abstract:
CClientOid objects represent OIDs referenced by one of more processes on this machine running as the same user.
Author:
Mario Goertzel [MarioGo]
Revision History:
MarioGo 04-08-95 Bits 'n pieces MarioGo 12-21-95 Rewrite - OIDs are not universally unique
--*/
#ifndef __COID_HXX
#define __COID_HXX
class CClientOid : public CId3TableElement /*++
Class Description:
Each instance of this class represtents an object being used on this or another machine by a one or more processes owned by a particular local identity on this machine.
Members:
_pOxid - Pointer to the OXID exporting this OID
_pSet - Pointer to the set which owns this OID
_cClients - The number of client processes actually using this object. Note: This value may only be changed with the client lock held exclusively. Note, also, that the set will not release its reference unless this value is zero. The effective reference count is _references + _cClients.
REVIEW: We could write our own Reference and Release methods. Then the client set could delete (rather then Release()) the oids directly.
_fIn:1 - A flag to indicate whether this object has already been added to the remote set.
--*/ { private :
CClientOxid *_pOxid; CClientSet *_pSet; DWORD _cClients; BOOL _fIn:1; // Is this OID in the remote set.
public :
CClientOid(ID &oid, ID &mid, CToken *pToken, CClientOxid *pOxid, CClientSet *pSet) : CId3TableElement(oid, mid, pToken), _pOxid(pOxid), _pSet(pSet), _fIn(FALSE), _cClients(1) { // Token is held by the set which we reference,
// no need for us to reference it ourself.
_pOxid->Reference(); _pSet->Reference(); }
~CClientOid();
BOOL In() { return(_fIn); }
void Added() { ASSERT(gpClientLock->HeldExclusive()); _fIn = TRUE; }
void Deleted() { ASSERT(gpClientLock->HeldExclusive()); _fIn = FALSE; }
void ClientReference() { ASSERT(gpClientLock->HeldExclusive()); _cClients++; if (_cClients == 1) { // Rereferenced.
_pSet->ObjectUpdate(this); } }
void ClientRelease() { ASSERT(gpClientLock->HeldExclusive()); _cClients--; if (_cClients == 0) { // Not referenced
_pSet->ObjectUpdate(this); // May release this.
} // This pointer maybe invalid.
}
BOOL Out() { return(_cClients == 0); }
inline CClientOxid* GetClientOxid() { return _pOxid; }
};
#endif // __COID_HXX
|