mirror of https://github.com/tongzx/nt5src
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.
155 lines
2.1 KiB
155 lines
2.1 KiB
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
worker.c
|
|
|
|
Abstract:
|
|
|
|
work items management functions
|
|
|
|
Author:
|
|
|
|
Stefan Solomon 07/11/1995
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
/*++
|
|
|
|
Function: CreateWorkItemsManager
|
|
|
|
Descr: creates the work items heap
|
|
|
|
--*/
|
|
|
|
HANDLE WiHeapHandle;
|
|
volatile LONG WorkItemsCount;
|
|
|
|
DWORD
|
|
CreateWorkItemsManager(VOID)
|
|
{
|
|
if((WiHeapHandle = HeapCreate(0,
|
|
0x8000, // 32k initial size
|
|
0x100000 // 1 meg max size
|
|
)) == NULL) {
|
|
|
|
return ERROR_CAN_NOT_COMPLETE;
|
|
}
|
|
WorkItemsCount = 0;
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
VOID
|
|
DestroyWorkItemsManager(VOID)
|
|
{
|
|
while (WorkItemsCount>0)
|
|
SleepEx (1000, TRUE);
|
|
HeapDestroy(WiHeapHandle);
|
|
}
|
|
|
|
/*++
|
|
|
|
Function: AllocateWorkItem
|
|
|
|
Descr: allocates the work item from the workitems heap
|
|
The function looks at the work item type and allocates a
|
|
packet at the end if required
|
|
|
|
--*/
|
|
|
|
PWORK_ITEM
|
|
AllocateWorkItem(ULONG Type)
|
|
{
|
|
PWORK_ITEM wip;
|
|
|
|
switch(Type) {
|
|
|
|
case WITIMER_TYPE:
|
|
|
|
if((wip = GlobalAlloc(GPTR, sizeof(WORK_ITEM))) == NULL) {
|
|
|
|
return NULL;
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if((wip = HeapAlloc(WiHeapHandle,
|
|
HEAP_ZERO_MEMORY,
|
|
sizeof(WORK_ITEM) + MAX_IPXWAN_PACKET_LEN)) == NULL) {
|
|
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
wip->Type = Type;
|
|
|
|
InterlockedIncrement((PLONG)&WorkItemsCount);
|
|
|
|
return wip;
|
|
}
|
|
|
|
/*++
|
|
|
|
Function: FreeWorkItem
|
|
|
|
Descr: frees the work item to the workitems heap
|
|
|
|
--*/
|
|
|
|
VOID
|
|
FreeWorkItem(PWORK_ITEM wip)
|
|
{
|
|
HGLOBAL rc_global;
|
|
BOOL rc_heap;
|
|
|
|
switch(wip->Type) {
|
|
|
|
case WITIMER_TYPE:
|
|
|
|
rc_global = GlobalFree(wip);
|
|
SS_ASSERT(rc_global == NULL);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
rc_heap = HeapFree(WiHeapHandle,
|
|
0,
|
|
wip);
|
|
|
|
SS_ASSERT(rc_heap);
|
|
|
|
break;
|
|
}
|
|
|
|
InterlockedDecrement((PLONG)&WorkItemsCount);
|
|
}
|
|
|
|
/*++
|
|
|
|
Function: EnqueueWorkItemToWorker
|
|
|
|
Descr: inserts a work item in the workers queue and signals the
|
|
event
|
|
|
|
Remark: Called with the Queues Lock held
|
|
|
|
--*/
|
|
|
|
VOID
|
|
EnqueueWorkItemToWorker(PWORK_ITEM wip)
|
|
{
|
|
InsertTailList(&WorkersQueue, &wip->Linkage);
|
|
|
|
SetEvent(hWaitableObject[WORKERS_QUEUE_EVENT]);
|
|
}
|