/*++

Copyright (c) 1995  Microsoft Corporation

Module Name:

	net\routing\ipx\sap\workers.h

Abstract:

	Header file for  agent work items

Author:

	Vadim Eydelman  05-15-1995

Revision History:

--*/
#ifndef _SAP_WORKERS_
#define _SAP_WORKERS_

	
// Max number of pending recv work items
extern LONG MaxUnprocessedRequests;

// Minimum number of queued recv requests
extern LONG	MinPendingRequests;

// How often to check on pending triggered update
extern ULONG TriggeredUpdateCheckInterval;
// How many requests to send if no response received within check interval
extern ULONG MaxTriggeredUpdateRequests;

// Whether to respond for internal servers that are not registered with SAP
// through the API calls (for standalone service only)
extern ULONG RespondForInternalServers;

// Delay in response to general reguests for specific server type
// if local servers are included in the packet
extern ULONG DelayResponseToGeneral;

// Delay in sending change broadcasts if packet is not full
extern ULONG DelayChangeBroadcast;

	// Workers that are enqueued for io processing
typedef struct _IO_WORKER {
		WORKERFUNCTION		worker;
		IO_PARAM_BLOCK		io;
		} IO_WORKER, *PIO_WORKER;

	// Workers that are enqueued for timer processing
typedef struct _TIMER_WORKER {
		WORKERFUNCTION		worker;
		TM_PARAM_BLOCK		tm;
		} TIMER_WORKER, *PTIMER_WORKER;

	// Workers that are enqueued to receive LPC request
typedef struct _LPC_WORKER {
		WORKERFUNCTION		worker;
		LPC_PARAM_BLOCK		lpc;
		} LPC_WORKER, *PLPC_WORKER;
/*
VOID
ScheduleWorkItem (
	WORKERFUNCTION *worker
	);
*/
#define ScheduleWorkItem(worker) RtlQueueWorkItem(*worker,worker,0)

#define ProcessCompletedIORequest(ioreq) \
		ScheduleWorkItem (&CONTAINING_RECORD(ioreq,IO_WORKER,io)->worker)

#define ProcessCompletedTimerRequest(tmreq) \
		ScheduleWorkItem (&CONTAINING_RECORD(tmreq,TIMER_WORKER,tm)->worker);

#define ProcessCompletedLpcRequest(lpcreq) \
		ScheduleWorkItem (&CONTAINING_RECORD(lpcreq,LPC_WORKER,lpc)->worker)


/*++
*******************************************************************
		I n i t i a l i z e W o r k e r s

Routine Description:
	Initialize heap to be used for allocation of work items
Arguments:
	None
Return Value:
	NO_ERROR - heap was initialized  OK
	other - operation failed (windows error code)
	
*******************************************************************
--*/
DWORD
InitializeWorkers (
	HANDLE	RecvEvent
	);

/*++
*******************************************************************
		S h u t d o w n W o r k e r s

Routine Description:
	Stops new worker creation and signals event when all
	workers are deleted
Arguments:
	doneEvent - event to be signalled when all workers are deleted
Return Value:
	None
	
*******************************************************************
--*/
VOID
ShutdownWorkers (
	IN HANDLE	doneEvent
	);
	
/*++
*******************************************************************
		D e l e t e W o r k e r s

Routine Description:
	Deletes heap used for work items
Arguments:
	None
Return Value:
	None
	
*******************************************************************
--*/
VOID
DeleteWorkers (
	void
	);


VOID
AddRecvRequests (
	LONG	count
	);

VOID
RemoveRecvRequests (
	LONG	count
	);

/*++
*******************************************************************
		I n i t R e q I t e m

Routine Description:
	Allocate and initialize IO request item
	Enqueue the request
Arguments:
	None
Return Value:
	NO_ERROR - item was initialized and enqueued OK
	other - operation failed (windows error code)
	
*******************************************************************
--*/
DWORD
InitReqItem (
	void
	);


/*++
*******************************************************************
		I n i t R e s p I t e m

Routine Description:
	Allocate and initialize SAP response item
	Call ProcessRespItem to fill the packet and send it
Arguments:
	intf - pointer to interface control block to send on
	svrType - type of servers to put in response packet
	dst - where to send the response packet
	bcast - are we responding to broadcasted request
Return Value:
	NO_ERROR - item was initialized and enqueued OK
	other - operation failed (windows error code)
	
*******************************************************************
--*/
DWORD
InitRespItem (
	PINTERFACE_DATA		intf,
	USHORT				svrType,
	PIPX_ADDRESS_BLOCK	dst,
	BOOL				bcast
	);

/*++
*******************************************************************
		I n i t G n e a r I t e m

Routine Description:
	Allocate and initialize GETNEAREST response work item
Arguments:
	intf - pointer to interface control block to send on
	svrType - type of servers to put in response packet
	dst - where to send the response packet
Return Value:
	NO_ERROR - item was initialized and enqueued OK
	other - operation failed (windows error code)
	
*******************************************************************
--*/
DWORD
InitGnearItem (
	PINTERFACE_DATA		intf,
	USHORT				svrType,
	PIPX_ADDRESS_BLOCK	dest
	);
	
/*++
*******************************************************************
		I n i t B c a s t I t e m

Routine Description:
	Allocate and initialize broadcast item
Arguments:
	intf - pointer to interface control block to send on
	chngEnum - enumeration handle in SDB change queue to track changed servers
Return Value:
	NO_ERROR - item was initialized and enqueued OK
	other - operation failed (windows error code)
	
*******************************************************************
--*/
DWORD
InitBcastItem (
	PINTERFACE_DATA		intf
	);

/*++
*******************************************************************
		I n i t S r e q I t e m

Routine Description:
	Allocate and initialize send request item (send SAP request on interface)
Arguments:
	intf - pointer to interface control block to send on
Return Value:
	NO_ERROR - item was initialized and enqueued OK
	other - operation failed (windows error code)
	
*******************************************************************
--*/
DWORD
InitSreqItem (
	PINTERFACE_DATA		intf
	);


/*++
*******************************************************************
		I n i t L P C I t e m

Routine Description:
	Allocate and initialize LPC work item
Arguments:
	None
Return Value:
	NO_ERROR - item was initialized and enqueued OK
	other - operation failed (windows error code)
	
*******************************************************************
--*/
DWORD
InitLPCItem (
	void
	);

/*++
*******************************************************************
		I n i t T r e q I t e m

Routine Description:
	Allocate and initialize triggered request item (send SAP request on interface
	and wait for responces to arrive)
Arguments:
	intf - pointer to interface control block to send on
Return Value:
	NO_ERROR - item was initialized and enqueued OK
	other - operation failed (windows error code)
	
*******************************************************************
--*/
DWORD
InitTreqItem (
	PINTERFACE_DATA			intf
	);

#endif