NT4/private/ole32/com/remote/idtable.hxx
2020-09-30 17:12:29 +02:00

73 lines
2.4 KiB
C++

//+-------------------------------------------------------------------
//
// File: idtable.hxx
//
// Contents: internal identity table definitions.
//
// Description:
// The table consists, logically, of two different
// keys which map to the same value. The two
// keys are the object identity (oid) and the
// controlling unknown (pUnkControl). The value
// is the pointer to the identity interface.
//
// Additionally, if the apartment model is in use,
// the thread forms an additional part of both keys.
//
// Presently this is implemented as an array of the
// three values and linear scans are used for lookup.
// Neither of the pointers are addref'd (as far as the
// table is concerned). Lookup does addref and return
// a pointer to the identity object. The pUnkControl
// is used solely for lookup.
//
// Possible changes: use two separate maps, one of
// which is keyed by the oid and the other keyed
// by pUnkControl. The value in the first map is
// the hKey of value in the second map. The id object
// would hold the hKey of the value in the first map
// to save on space. Using two maps increases the
// speed of lookup for large numbers of ids, but
// increases the cost per id from 40bytes to 48bytes.
// (40 = 2 GUIDS + 2 far pointers; 48 = 1 GUID +
// 3 hKeys/ptrs + 16 bytes overhead for two hash
// buckets)
//
// It is also possible to use one map (keyed by
// the oid) and trim the array by the GUID. The
// cost per id is 40bytes (1 GUID + 1 hKey + 3 ptr +
// 8 bytes overhead for one hash bucket).
//
//
// History: 1-Dec-93 CraigWi Created
//
//--------------------------------------------------------------------
#ifndef __IDTABLE__
#define __IDTABLE__
#include <olerem.h>
// entry in id array; the array is packed (no NULL holes)
// NOTE: when looking up for the apartment model, we pair the two fields
// m_oid/m_tid and m_tid/m_pUnkControl;
struct IDENTRY
{
OID m_oid;
DWORD m_tid;
IUnknown *m_pUnkControl; // not addref'd directly
IStdIdentity *m_pStdID; // not addref'd directly
};
#include <array_id.h>
// other functions declared in olerem.h
INTERNAL SetObjectID(REFOID oid, IUnknown *pUnkControl, IStdIdentity *pStdID,
IStdIdentity **ppStdIDExisting);
INTERNAL ClearObjectID(REFOID oid, IUnknown *pUnkControl, IStdIdentity *pStdID);
INTERNAL ClearObjectUnk(REFOID oid, IUnknown *pUnkControl, IStdIdentity *pStdID);
#endif // __IDTABLE__