windows-nt/Source/XPSP1/NT/com/rpc/ndrlib/ctxcoll.hxx
2020-09-26 16:20:57 +08:00

144 lines
2.7 KiB
C++

/*++
Copyright (C) Microsoft Corporation, 2000
Module Name:
CtxColl.hxx
Abstract:
Class definitions for the context handle collection.
Author:
Kamen Moutafov [KamenM]
Revision History:
KamenM Sep 2000 Created
--*/
#if _MSC_VER >= 1200
#pragma once
#endif
#ifndef __CTXCOLL_HXX_
#define __CTXCOLL_HXX_
// the collection of context handles. For right now
// a simple double linked list. For the future, we
// have to find something more scalable for large
// number of elements
class ContextCollection
{
private:
LIST_ENTRY ListHead;
MUTEX CollectionMutex;
public:
ContextCollection (
IN OUT RPC_STATUS *RpcStatus
) : CollectionMutex(RpcStatus,
TRUE, // fPreallocateSemaphore
0 // dwSpinCount
)
/*++
Routine Description:
C-tor
Arguments:
RpcStatus - Must be RPC_S_OK on input. Returns either RPC_S_OK or RPC_S_OUT_OF_MEMORY.
--*/
{
RpcpInitializeListHead(&ListHead);
}
inline void
Lock (
void
)
{
CollectionMutex.Request();
}
inline void
Unlock (
void
)
{
CollectionMutex.Clear();
}
inline void
Add (
IN ServerContextHandle *NewHandle
)
{
CollectionMutex.VerifyOwned();
RpcpfInsertHeadList(&ListHead, &NewHandle->ContextChain);
}
inline void
Remove (
IN ServerContextHandle *Handle
)
{
CollectionMutex.VerifyOwned();
RpcpfRemoveEntryList(&Handle->ContextChain);
}
inline ServerContextHandle *
GetNext (
IN OUT LIST_ENTRY **CurrentListEntry
)
{
ServerContextHandle *ContextHandle;
CollectionMutex.VerifyOwned();
ASSERT (CurrentListEntry != NULL);
// if we have started with NULL, return the first element
if (*CurrentListEntry == NULL)
{
*CurrentListEntry = ListHead.Flink;
}
// if we have reached the end (or were empty to start with) return NULL
if (*CurrentListEntry == &ListHead)
{
return NULL;
}
ContextHandle = CONTAINING_RECORD(*CurrentListEntry, ServerContextHandle, ContextChain);
*CurrentListEntry = (*CurrentListEntry)->Flink;
return ContextHandle;
}
ServerContextHandle *
Find (
IN WIRE_CONTEXT *WireContext
);
static RPC_STATUS
AllocateContextCollection (
OUT ContextCollection **NewColl
);
};
RPC_STATUS
NDRSContextInitializeCollection (
IN ContextCollection **ContextCollectionPlaceholder
);
#endif // __CTXCOLL_HXX