windows-nt/Source/XPSP1/NT/inetsrv/iis/iisrearc/ul/misc/objtablep.h

151 lines
2.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1999-1999 Microsoft Corporation
Module Name:
objtablep.h
Abstract:
This module contains private declarations and definitions for the
UL object table package.
Author:
Keith Moore (keithmo) 20-Apr-1999
Revision History:
--*/
#ifndef _OBJTABLEP_H_
#define _OBJTABLEP_H_
//
// Our cyclic type. Just a 32-bit value.
//
typedef ULONG CYCLIC;
//
// An object table.
//
typedef struct _UL_OBJECT_TABLE
{
//
// Structure signature.
//
ULONG Signature;
//
// The lock protecting the table.
//
UL_SPIN_LOCK TableSpinLock;
//
// The free entry list. Note that the spin-lock is only used on
// processor architectures that don't natively support SLISTs.
//
SLIST_HEADER FreeEntrySListHead;
KSPIN_LOCK FreeEntrySListLock;
//
// The first-level lookup table.
//
struct _UL_OBJECT_TABLE_ENTRY **ppFirstLevelTable;
//
// Usage counters.
//
ULONG FirstLevelTableSize;
ULONG FirstLevelTableInUse;
//
// The cyclic.
//
CYCLIC Cyclic;
} UL_OBJECT_TABLE, *PUL_OBJECT_TABLE;
//
// The internal structure of an UL_OPAQUE_ID.
//
// N.B. This structure must be EXACTLY the same size as an UL_OPAQUE_ID!
//
#define FIRST_INDEX_BIT_WIDTH 24
#define SECOND_INDEX_BIT_WIDTH 8
typedef union _OPAQUE_ID_INTERNAL
{
UL_OPAQUE_ID OpaqueId;
struct
{
CYCLIC Cyclic;
ULONG FirstIndex:FIRST_INDEX_BIT_WIDTH;
ULONG SecondIndex:SECOND_INDEX_BIT_WIDTH;
};
} OPAQUE_ID_INTERNAL, *POPAQUE_ID_INTERNAL;
C_ASSERT( sizeof(UL_OPAQUE_ID) == sizeof(OPAQUE_ID_INTERNAL) );
C_ASSERT( (FIRST_INDEX_BIT_WIDTH + SECOND_INDEX_BIT_WIDTH) ==
(sizeof(CYCLIC) * 8) );
//
// A second-level table entry.
//
// Note that FreeListEntry and pContext are in an anonymous
// union to save space; an entry is either on the free list or in use,
// so only one of these fields will be used at a time.
//
// Also note that Cyclic is in a second anonymous union. It's overlayed
// with FirstLevelIndex (which is basically the second-level table's
// index in the first-level table) and EntryType (used to distinguish
// free entries from in-use entries). The internal GetNextCyclic() function
// is careful to always return cyclics with EntryType set to
// ENTRY_TYPE_IN_USE.
//
typedef struct _OPAQUE_ID_TABLE_ENTRY
{
union
{
SINGLE_LIST_ENTRY FreeListEntry;
PVOID pContext;
};
union
{
CYCLIC Cyclic;
struct
{
ULONG FirstLevelIndex:FIRST_INDEX_BIT_WIDTH;
ULONG EntryType:SECOND_INDEX_BIT_WIDTH;
};
};
} OPAQUE_ID_TABLE_ENTRY, *POPAQUE_ID_TABLE_ENTRY;
#define ENTRY_TYPE_FREE 0xFF
#define ENTRY_TYPE_IN_USE 0x00
#endif // _OBJTABLEP_H_