|
|
#ifndef _WINSQUE_
#define _WINSQUE_
#ifdef __cplusplus
extern "C" { #endif
/*
TODO --
Maybe: Coalesce different queue structures into one. */ /*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
queue.c
Abstract:
This is the header file to be included for calling queue.c functions
Functions:
Portability:
This module is portable.
Author:
Pradeep Bahl (PradeepB) Dec-1992
Revision History:
Modification Date Person Description of Modification ------------------ ------- ---------------------------
--*/
/*
defines */ #include <time.h>
#include "wins.h"
#include "comm.h"
#include "assoc.h"
#include "nmsdb.h"
#include "nmsmsgf.h"
#include "nmschl.h"
#define QUE_NBT_WRK_ITM_SZ sizeof(NBT_REQ_WRK_ITM_T)
/*
QUE_INIT_BUFF_HEAP_SIZE -- This is the initial size of the heap for allocating queue items for the various queues */ #define QUE_INIT_BUFF_HEAP_SIZE 10000
#define WINS_QUEUE_HWM 500
#define WINS_QUEUE_HWM_MAX 5000
#define WINS_QUEUE_HWM_MIN 50
/*
macros */
/*
externs */ //
// forward declarator
//
struct _QUE_HD_T;
extern struct _QUE_HD_T *pWinsQueQueHd[];
/*
forward declaration */ typedef struct _QUE_HD_T QUE_HD_T;
extern QUE_HD_T QueNbtWrkQueHd; //head for nbt req queue
#if REG_N_QUERY_SEP > 0
extern QUE_HD_T QueOtherNbtWrkQueHd; //head for nbt reg. req queue
extern DWORD QueOtherNbtWrkQueMaxLen; #endif
extern QUE_HD_T QueRplPullQueHd; //head for rpl pull thread's queue
extern QUE_HD_T QueRplPushQueHd; //head for rpl push thread's queue
extern QUE_HD_T QueNmsNrcqQueHd; //head for challenge queue used by NBT thds
extern QUE_HD_T QueNmsRrcqQueHd; //head for challenge queue used by Replicator
extern QUE_HD_T QueNmsCrqQueHd; //head for response queue for challenges sent
extern QUE_HD_T QueWinsTmmQueHd; //head for timer manager queue
extern QUE_HD_T QueWinsScvQueHd; //head for scavenger queue
extern QUE_HD_T QueInvalidQueHd; //head for an invalid queue. Never inited
extern HANDLE QueBuffHeapHdl; //handle to heap for use for queue items
/*
structure definitions */
/*
QUE_TYP_E -- enumerator for the various queue types.
Used by QueInsertWrkItm and its callers Used by QueRemoveWrkItm and its callers
This enumerator's value index the spQueHd (queue.c) array. Do not change the order of entries without changing QueHd's static initialization appropriately */ typedef enum __QUE_TYP_E { QUE_E_NBT_REQ = 0, //nbt req queue
#if REG_N_QUERY_SEP > 0
QUE_E_OTHER_NBT_REQ, //reg/rel nbt req queue
#endif
QUE_E_RPLPULL, //pull thread queue
QUE_E_RPLPUSH, //push thread queue
QUE_E_NMSNRCQ, //nbt request challenge queue
QUE_E_NMSRRCQ, //replicator request challenge queue
QUE_E_NMSCRQ, //challenge response queue
QUE_E_WINSTMQ, //timer queue
QUE_E_WINSSCVQ, //Scavenger queue
QUE_E_UNKNOWN_TYPQ, //Unknown type of queue
QUE_E_TOTAL_NO_QS //Total no of queues
} QUE_TYP_E, *PQUE_TYP_E;
//
// Work items for the different queues.
//
// NOTE NOTE NOTE -- The work items must have LIST_ENTRY
// as the first field in them.
//
typedef struct _NBT_REQ_WRK_ITM_T { LIST_ENTRY Head; QUE_TYP_E QueTyp_e; COMM_HDL_T DlgHdl; MSG_T pMsg; MSG_LEN_T MsgLen; } NBT_REQ_WRK_ITM_T, *PNBT_REQ_WRK_ITM_T; //
// CHL_REQ_WRK_ITM_T -- Name challenge queue work item. This is a work item
// that can be used for any of the four name challenge
// queues NRCQ, RRCQ, and CRQ
//
typedef struct _CHL_REQ_WRK_ITM_T { LIST_ENTRY Head; QUE_TYP_E QueTyp_e; COMM_HDL_T DlgHdl; //dlg handle
MSG_T pMsg; //NBT message recd
MSG_LEN_T MsgLen; //msg len
DWORD QuesNamSecLen; //Length of question name sec.
NMSDB_ROW_INFO_T NodeToReg; //Info of node To Register
NMSDB_NODE_ADDS_T NodeAddsInCnf; BOOL fGroupInCnf; //whether the cnf record is group or unique
DWORD OwnerIdInCnf; // BYTE NodeTypInCnf;
// BYTE EntTypInCnf;
COMM_ADD_T AddToReg;
//COMM_ADD_T AddOfNodeInCnf;
COMM_ADD_T AddOfRemWins; //address of remote WINS to
//be sent the name reg request
//so that the version number
//of the record that caused
//the conflict gets updated
NMSCHL_CMD_TYP_E CmdTyp_e; WINS_CLIENT_E Client_e; NMSMSGF_NAM_REQ_TYP_E ReqTyp_e; //query or release
DWORD NoOfAddsToUse; DWORD NoOfAddsToUseSv; } CHL_REQ_WRK_ITM_T, *PCHL_REQ_WRK_ITM_T;
//
// The response work item is the same as the challenge work item
//
typedef struct _CHL_REQ_WRK_ITM_T CHL_RSP_WRK_ITM_T, *PCHL_RSP_WRK_ITM_T;
typedef struct _QUE_HD_T { LIST_ENTRY Head; CRITICAL_SECTION CrtSec; HANDLE EvtHdl; HANDLE HeapHdl; DWORD NoOfEntries; } QUE_HD_T, *PQUE_HD_T;
/*
QUE_CMD_TYP_E - Various Command Types that can be specified in the work item of one or more work queues */ typedef enum QUE_CMD_TYP_E { QUE_E_CMD_REPLICATE = 0, //Replicate command directd to the Pull
//thread as a result of administrative
//action
QUE_E_CMD_PULL_RANGE, //Pull Range command directd to the Pull
//thread as a result of administrative
//action
QUE_E_CMD_REPLICATE_MSG, //Replicate message received by COMSYS TCP
//thread
QUE_E_CMD_SND_PUSH_NTF, //push update count to remote WINS. This is
//a cmd to the Pull thread at the local WINS
//(by an NBT thread) and a request to the
//Pull thread at the remote WINS.
QUE_E_CMD_SND_PUSH_NTF_PROP, //identical to the above except that
//this one requests propagation along the
//the chain of WINSs (Pull Partners)
QUE_E_CMD_HDL_PUSH_NTF, //handle Push notification from a remote WINS.
//This is a command forwarded to the PULL
//thread by the Push thread
QUE_E_CMD_CONFIG, //set configuration request
QUE_E_CMD_DELETE_WINS, //Delete WINS from add-vers map tables (records
//are also deleted)
QUE_E_CMD_SET_TIMER, //set timer request to TMM
QUE_E_CMD_CANCEL_TIMER, //cancel timer request to TMM
QUE_E_CMD_MODIFY_TIMER, //modify timer reqyest to TMM
QUE_E_CMD_TIMER_EXPIRED, //response to an earlier set timer request
QUE_E_CMD_SCV_ADMIN, // Admin initiated request
QUE_E_CMD_ADDR_CHANGE // Address of the local machine changed
} QUE_CMD_TYP_E, *PQUE_CMD_TYP_E;
/*
Work item for the Replicator's queue
It is used in the work queue of both the PULL thread and the PUSH thread.
CmdTyp_e pClientCtx
E_RPL NULL E_CONFIG address of list of RPL_CONFIG_REC_T records terminated by NULL E_REPLICATE address of list of RPL_CONFIG_REC_T records terminated by NULL E_TIMER_EXPIRE address of list of RPL_CONFIG_REC_T records terminated by NULL
*/
//
// The replicator, timer and Scavenger work items must have LIST_ENTRY,
// QUE_TYP_E, and QUE_CMD_TYP_E as the top 3 fields in this order.
//
// Refer RplPullInit and RplPushInit to discover why.
//
typedef struct _QUE_RPL_REQ_WRK_ITM_T { LIST_ENTRY Head; QUE_TYP_E QueTyp_e; QUE_CMD_TYP_E CmdTyp_e;
//
// Don't change the order of the three fields above. Also,
// they need to be at the top. See comment above
//
COMM_HDL_T DlgHdl; MSG_T pMsg; MSG_LEN_T MsgLen; LPVOID pClientCtx; /*client context. For example,
*it may point to config *records (RPL_CONFIG_REC_T *in case the cmd is E_CONFIG */ DWORD MagicNo; //used by IsTimeoutToBeIgnored()
//in rplpull.c
} QUE_RPL_REQ_WRK_ITM_T, *PQUE_RPL_REQ_WRK_ITM_T;
//
// SCV_REQ_WRK_ITM_E
//
typedef enum WINSINTF_SCV_OPC_E QUE_SCV_OPC_E, *PQUE_SCV_OPC_E;
typedef struct _QUE_SCV_REQ_WRK_ITM_T { LIST_ENTRY Head; QUE_TYP_E QueTyp_e; QUE_CMD_TYP_E CmdTyp_e; WINSINTF_SCV_OPC_E Opcode_e; DWORD Age; BOOL fForce; } QUE_SCV_REQ_WRK_ITM_T, *PQUE_SCV_REQ_WRK_ITM_T;
/*
Que of timer manager */ typedef struct _QUE_TMM_REQ_WRK_ITM_T { LIST_ENTRY Head; QUE_TYP_E QueTyp_e; QUE_CMD_TYP_E CmdTyp_e;
//
// Don't change the order of the three fields above. Also,
// they need to be at the top. They have to be in the same order
// and position within this and the _QUE_RPL_REQ_WRK_ITM_T data
// structure
//
DWORD ReqId; //id of request
WINS_CLIENT_E Client_e; //maybe not needed. Check ??
time_t TimeInt; //Time Interval
time_t AbsTime; //Absolute time
DWORD DeltaTime; //Delta time
HANDLE RspEvtHdl; //event to signal for response
PQUE_HD_T pRspQueHd; //Que to put the response on
LPVOID pClientCtx; /*client context. For example,
*it may point to config *records (RPL_CONFIG_REC_T *in case the cmd is E_CONFIG */ DWORD MagicNo; //used by IsTimeoutToBeIgnored()
//in rplpull.c
} QUE_TMM_REQ_WRK_ITM_T, *PQUE_TMM_REQ_WRK_ITM_T;
/*
function prototypes */
extern STATUS QueInsertNbtWrkItm( IN PCOMM_HDL_T pDlgHdl, IN MSG_T pMsg, IN MSG_LEN_T MsgLen );
extern STATUS QueRemoveNbtWrkItm( OUT PCOMM_HDL_T pDlgHdl, OUT PMSG_T ppMsg, OUT PMSG_LEN_T pMsgLen ); #if REG_N_QUERY_SEP > 0
extern STATUS QueInsertOtherNbtWrkItm( IN PCOMM_HDL_T pDlgHdl, IN MSG_T pMsg, IN MSG_LEN_T MsgLen );
extern STATUS QueRemoveOtherNbtWrkItm( OUT PCOMM_HDL_T pDlgHdl, OUT PMSG_T ppMsg, OUT PMSG_LEN_T pMsgLen ); #endif
extern STATUS QueInsertChlReqWrkItm( IN NMSCHL_CMD_TYP_E CmdTyp_e, IN WINS_CLIENT_E Client_e, IN PCOMM_HDL_T pDlgHdl, IN MSG_T pMsg, IN MSG_LEN_T MsgLen, IN DWORD QuesNamSecLen, IN PNMSDB_ROW_INFO_T pNodeToReg, IN PNMSDB_STAT_INFO_T pNodeInCnf, //IN PCOMM_ADD_T pAddOfNodeInCnf,
IN PCOMM_ADD_T pAddOfRemWins );
extern STATUS QueRemoveChlReqWrkItm( IN HANDLE EvtHdl, IN OUT LPVOID *ppaWrkItm, OUT LPDWORD pNoOfReqs );
extern STATUS QueInsertChlRspWrkItm( IN PCOMM_HDL_T pDlgHdl, IN MSG_T pMsg, IN MSG_LEN_T MsgLen );
extern STATUS QueRemoveChlRspWrkItm( OUT LPVOID *ppWrkItm );
extern STATUS QueInsertWrkItm ( IN PLIST_ENTRY pWrkItm, IN QUE_TYP_E QueTyp_e, IN PQUE_HD_T pQueHdPassed );
extern STATUS QueGetWrkItm ( IN QUE_TYP_E QueTyp_e, OUT LPVOID *ppWrkItm );
extern VOID QueAllocWrkItm( IN HANDLE HeapHdl, IN DWORD Size, OUT LPVOID *ppBuf );
extern VOID QueDeallocWrkItm( IN HANDLE HeapHdl, IN LPVOID pBuff );
extern STATUS QueInsertWrkItmAtHdOfList ( IN PLIST_ENTRY pWrkItm, IN QUE_TYP_E QueTyp_e, IN PQUE_HD_T pQueHdPassed );
extern STATUS QueInsertRplPushWrkItm ( IN PLIST_ENTRY pWrkItm, IN BOOL fAlreadyInCrtSec );
extern STATUS QueInsertNetNtfWrkItm ( IN PLIST_ENTRY pWrkItm );
extern STATUS QueInsertSndNtfWrkItm ( IN PLIST_ENTRY pWrkItm );
extern VOID QueChlWaitForRsp( VOID ); extern VOID QueChlNoWaitForRsp( VOID );
extern __inline STATUS QueInsertScvWrkItm( PLIST_ENTRY pWrkItm );
extern __inline STATUS QueRemoveScvWrkItm( LPVOID *ppWrkItm );
extern VOID WinsQueInit( LPTSTR pName, PQUE_HD_T pQueHd );
#ifdef __cplusplus
} #endif
#endif //_WINSQUE_
|