144 lines
2.7 KiB
C++
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
|
|
|