Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

494 lines
17 KiB

#ifndef _WRGPOS_H_
#define _WRGPOS_H_
#ifdef __TANDEM
#pragma columns 79
#pragma page "wrgpos.h - T9050 - OS-dependent external decs for Regroup Module"
#endif
/* @@@ START COPYRIGHT @@@
** Tandem Confidential: Need to Know only
** Copyright (c) 1995, Tandem Computers Incorporated
** Protected as an unpublished work.
** All Rights Reserved.
**
** The computer program listings, specifications, and documentation
** herein are the property of Tandem Computers Incorporated and shall
** not be reproduced, copied, disclosed, or used in whole or in part
** for any reason without the prior express written permission of
** Tandem Computers Incorporated.
**
** @@@ END COPYRIGHT @@@
**/
/*---------------------------------------------------------------------------
* This file (wrgpos.h) contains OS-specific declarations used by
* srgpos.c.
*---------------------------------------------------------------------------*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/*-----------------------------------NSK section-----------------------------*/
#ifdef NSK
#include <dmilli.h>
#include <jmsgtrc.h>
#define QUEUESEND _send_queued_()
/* Regroup tracing macro */
/* In NSK, regroup uses the trace buffer and macro provided by the
* message system. Regroup puts TR_NODATA for the trace type.
*/
#define RGP_TRACE( str, parm1, parm2, parm3, parm4 ) \
TRACE_L1 ( str, TR_NODATA, parm1, parm2, parm3, parm4 )
/* Regroup counters */
/* In NSK, regroup uses the counter buffer and macro provided by the
* message system.
*/
#define RGP_INCREMENT_COUNTER TCount
/* Macros to lock and unlock the regroup data structure to prevent
* access by interrupt handlers or other processors (in SMP nodes).
*/
/* On NSK with uniprocessor nodes, these macros must mask off the
* interrupt handlers that can access the regroup structure, namely,
* the IPC and timer interrupts.
*
* To avoid complexities due to nesting of MUTEXes, the regroup locks
* are defined to be no-ops. The NSK caller of all regroup routines
* (except the inquiry routines rgp_estimate_memory, rgp_sequence_number
* and rgp_is_perturbed) must ensure that IPC and timer interrupts are
* disabled before calling the regroup routine.
*/
#define RGP_LOCK /* null; NSK must ensure that timer and IPC interrupts
are disabled before calling regroup routines. */
#define RGP_UNLOCK /* null; NSK must ensure that timer and IPC interrupts
are disabled before calling regroup routines. */
#ifdef __TANDEM
#pragma fieldalign shared8 OS_specific_rgp_control
#endif /* __TANDEM */
typedef struct OS_specific_rgp_control
{
uint32 filler; /* no special fields needed for NSK */
} OS_specific_rgp_control_t;
#endif /* NSK */
/*-----------------------------end of NSK section----------------------------*/
/*-----------------------------------LCU section-----------------------------*/
#ifdef LCU
#include <lcuxprt.h>
#define LCU_RGP_PORT 0 /* pick up from appropriate file */
#define HZ 100 /* pick up from appropriate file */
#define plstr 0 /* pick up from appropriate file */
#define TO_PERIODIC 0 /* pick up from appropriate file */
#define CE_PANIC 3 /* pick up from appropriate file */
#define LCU_RGP_FLAGS (LCUF_SENDMSG || LCUF_NOSLEEP) /* msg alloc flags */
extern void rgp_msgsys_work(lcumsg_t *lcumsgp, int status);
#define QUEUESEND rgp_msgsys_work(NULL, 0)
/* Regroup tracing macro */
#define RGP_TRACE( str, parm1, parm2, parm3, parm4 ) /* empty for now */
/* Regroup counters */
typedef struct
{
uint32 QueuedIAmAlive;
uint32 RcvdLocalIAmAlive;
uint32 RcvdRemoteIAmAlive;
uint32 RcvdRegroup;
} rgp_counter_t;
#define RGP_INCREMENT_COUNTER( field ) rgp->OS_specific_control.counter.field++
/* Regroup locks */
typedef struct rgp_lock
{
uint32 var1;
uint32 var2;
} rgp_lock_t;
/* Macros to lock and unlock the regroup data structure to prevent
* access by interrupt handlers or other processors (in SMP nodes)
*/
#define RGP_LOCK /* null for now; need to be filled in */
#define RGP_UNLOCK /* null for now; need to be filled in */
typedef struct
{
rgp_lock_t rgp_lock; /* to serialize access */
rgp_counter_t counter; /* to count events */
lcumsg_t *lcumsg_regroup_p; /* pointer to regroup status message */
lcumsg_t *lcumsg_iamalive_p; /* pointer to iamalive message */
lcumsg_t *lcumsg_poison_p; /* pointer to poison message */
sysnum_t my_sysnum; /* local system number */
} OS_specific_rgp_control_t;
#endif /* LCU */
/*-----------------------------end of LCU section----------------------------*/
/*----------------------------------UNIX section-----------------------------*/
#ifdef UNIX
extern void rgp_msgsys_work(void);
#define QUEUESEND rgp_msgsys_work();
#include <jrgp.h>
#include <wrgp.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <stdio.h>
extern int errno;
#define MSG_FLAGS 0 /* flags for message send/receive */
#define RGP_PORT_BASE 5757 /* for use with sockets */
typedef struct
{
int event;
union
{
node_t node;
rgpinfo_t rgpinfo;
} data; /* depends on the event */
rgp_unseq_pkt_t unseq_pkt;
} rgp_msgbuf;
#define BUFLEN sizeof(rgp_msgbuf)
/* Additional events created for testing regroup using process-level
* simulation.
*/
#define RGP_EVT_START 10
#define RGP_EVT_ADD_NODE 11
#define RGP_EVT_MONITOR_NODE 12
#define RGP_EVT_REMOVE_NODE 13
#define RGP_EVT_GETRGPINFO 14
#define RGP_EVT_SETRGPINFO 15
#define RGP_EVT_HALT 16
#define RGP_EVT_FREEZE 17
#define RGP_EVT_THAW 18
#define RGP_EVT_STOP_SENDING 19
#define RGP_EVT_RESUME_SENDING 20
#define RGP_EVT_STOP_RECEIVING 21
#define RGP_EVT_RESUME_RECEIVING 22
#define RGP_EVT_SEND_POISON 23
#define RGP_EVT_STOP_TIMER_POPS 24
#define RGP_EVT_RESUME_TIMER_POPS 25
#define RGP_EVT_RELOAD 26
#define RGP_EVT_FIRST_EVENT 1
#define RGP_EVT_FIRST_DEBUG_EVENT 10
#define RGP_EVT_LAST_EVENT 26
/* Regroup tracing macro */
#define RGP_TRACE( str, parm1, parm2, parm3, parm4 ) \
do \
{ \
printf("Node %3d: %16s: 0x%8X, 0x%8X, 0x%8X, 0x%8X.\n", \
EXT_NODE(rgp->mynode), str, parm1, parm2, parm3, parm4); \
fflush(stdout); \
} while (0)
/* Regroup counters */
typedef struct
{
uint32 QueuedIAmAlive;
uint32 RcvdLocalIAmAlive;
uint32 RcvdRemoteIAmAlive;
uint32 RcvdRegroup;
} rgp_counter_t;
#define RGP_INCREMENT_COUNTER( field ) rgp->OS_specific_control.counter.field++
/* Macros to lock and unlock the regroup data structure to prevent
* access by interrupt handlers or other processors (in SMP nodes)
*/
#define RGP_LOCK /* null; all access done from one thread */
#define RGP_UNLOCK /* null; all access done from one thread */
/* This struct keeps some debugging info. */
typedef struct rgpdebug
{
uint32 frozen : 1; /* node is frozen; ignore all events except
the thaw command */
uint32 reload_in_progress : 1; /* reload in progess; if set, refuse
new reload command */
uint32 unused : 30;
cluster_t stop_sending; /* stop sending to these nodes */
cluster_t stop_receiving; /* stop receiving from these nodes */
} rgp_debug_t;
typedef struct
{
rgp_counter_t counter; /* to count events */
rgp_debug_t debug; /* for debugging purposes */
} OS_specific_rgp_control_t;
/* Variables and routines provided by the srgpsvr.c driver program */
extern unsigned int alarm_period;
extern void alarm_handler(void);
extern void (*alarm_callback)();
extern void rgp_send(node_t node, void *data, int datasize);
extern void rgp_msgsys_work();
#endif /* UNIX */
/*----------------------------end of UNIX section----------------------------*/
/*----------------------------------NT section-----------------------------*/
#ifdef NT
extern void rgp_msgsys_work(void);
#define QUEUESEND rgp_msgsys_work();
#if !defined (TDM_DEBUG)
#define LOG_CURRENT_MODULE LOG_MODULE_MM
#include <service.h>
#include <winsock2.h>
#else //TDM_DEBUG
#define _WIN32_WINNT 0x0400
#include <mmapi.h>
#include <time.h>
extern int errno;
#endif
#include <jrgp.h>
#include <wrgp.h>
#include <stdlib.h>
#include <sys/types.h>
#include <errno.h>
#include <stdio.h>
#include <windows.h>
#include <clmsg.h>
#undef small // otherwise we have to change a bunch of our code
typedef struct
{
int event;
union
{
node_t node;
rgpinfo_t rgpinfo;
} data; /* depends on the event */
rgp_unseq_pkt_t unseq_pkt;
} rgp_msgbuf;
#define BUFLEN sizeof(rgp_msgbuf)
/* Additional events created for testing regroup using process-level
* simulation.
*/
#define RGP_EVT_START 10
#define RGP_EVT_ADD_NODE 11
#define RGP_EVT_MONITOR_NODE 12
#define RGP_EVT_REMOVE_NODE 13
#define RGP_EVT_GETRGPINFO 14
#define RGP_EVT_SETRGPINFO 15
#define RGP_EVT_HALT 16
#define RGP_EVT_FREEZE 17
#define RGP_EVT_THAW 18
#define RGP_EVT_STOP_SENDING 19
#define RGP_EVT_RESUME_SENDING 20
#define RGP_EVT_STOP_RECEIVING 21
#define RGP_EVT_RESUME_RECEIVING 22
#define RGP_EVT_SEND_POISON 23
#define RGP_EVT_STOP_TIMER_POPS 24
#define RGP_EVT_RESUME_TIMER_POPS 25
#define RGP_EVT_RELOAD 26
#define RGP_EVT_TRACING 27
#define RGP_EVT_INFO 28
// MM events
#define MM_EVT_EJECT 29
#define MM_EVT_LEAVE 30
#define MM_EVT_INSERT_TESTPOINTS 31
#define RGP_EVT_FIRST_EVENT 1
#define RGP_EVT_FIRST_DEBUG_EVENT 10
#define RGP_EVT_LAST_EVENT 31
/* internal timeout for acknowledged messages */
#define RGP_ACKMSG_TIMEOUT 500 // 0.5 seconds
/* Regroup tracing macro */
#if defined (TDM_DEBUG)
#define RGP_TRACE( str, parm1, parm2, parm3, parm4 ) \
if ( rgp->OS_specific_control.debug.doing_tracing ) \
do \
{ \
printf("Node %3d: %16hs: 0x%8X, 0x%8X, 0x%8X, 0x%8X.\n", \
EXT_NODE(rgp->mynode), str, parm1, parm2, parm3, parm4); \
fflush(stdout); \
} while (0)
#else // WOLFPACK
#define RGP_TRACE( str, parm1, parm2, parm3, parm4 ) \
ClRtlLogPrint(LOG_NOISE, \
"[RGP] Node %1!d!: %2!16hs!: 0x%3!x!, 0x%4!x!, 0x%5!x!, 0x%6!x!.\n", \
EXT_NODE(rgp->mynode), str, parm1, parm2, parm3, parm4)
#endif
/* Regroup counters */
typedef struct
{
uint32 QueuedIAmAlive;
uint32 RcvdLocalIAmAlive;
uint32 RcvdRemoteIAmAlive;
uint32 RcvdRegroup;
} rgp_counter_t;
#define RGP_INCREMENT_COUNTER( field ) rgp->OS_specific_control.counter.field++
/* Macros to lock and unlock the regroup data structure to prevent
* access from other concurrent threads.
*/
#define RGP_LOCK EnterCriticalSection( &rgp->OS_specific_control.RgpCriticalSection );
#define RGP_UNLOCK LeaveCriticalSection( &rgp->OS_specific_control.RgpCriticalSection );
#if defined(TDM_DEBUG)
typedef union {
struct {
uint32 joinfailADD : 1;
uint32 joinfailMON : 1;
uint32 description3 : 1;
uint32 description4 : 1;
uint32 description5 : 1;
uint32 description6 : 1;
uint32 description7 : 1;
uint32 description8 : 1;
uint32 description9 : 1;
uint32 description10 : 1;
uint32 description11 : 1;
uint32 description12 : 1;
uint32 description13 : 1;
uint32 description14 : 1;
uint32 description15 : 1;
uint32 description16 : 1;
uint32 morebits : 16;
} TestPointBits;
uint32 TestPointWord;
}TestPointInfo;
/* This struct keeps some debugging info. */
typedef struct rgpdebug
{
uint32 frozen : 1; /* node is frozen; ignore all events except
the thaw command */
uint32 reload_in_progress : 1; /* reload in progess; if set, refuse
new reload command */
uint32 timer_frozen : 1; /* timer pops are ignored */
uint32 doing_tracing : 1; /* whether or not RGP_TRACE is a nop */
uint32 unused : 28;
cluster_t stop_sending; /* stop sending to these nodes */
cluster_t stop_receiving; /* stop receiving from these nodes */
TestPointInfo MyTestPoints; /* Controls test points for error/other insertion */
} rgp_debug_t;
#endif // TDM_DEBUG
typedef struct
{
rgp_counter_t counter; /* to count events */
HANDLE TimerThread; /* HANDLE of HeartBeat timer thread */
DWORD TimerThreadId;/* Thread ID of HeartBeat timer thread */
HANDLE TimerSignal; /* Event used to change HB rate and cause Terminate */
HANDLE RGPTimer; /* Regroup Timer - Used by timer thread */
CRITICAL_SECTION RgpCriticalSection; /* CriticalSection object for regroup activities */
ULONG EventEpoch; /* used to detect stale events from clusnet */
MMNodeChange UpDownCallback; /*Callback to announce node up and node down event*/
MMQuorumSelect QuorumCallback; /*Callback to check if Quorum disk accessible - split brain avoidance */
MMHoldAllIO HoldIOCallback; /*Callback to suspend all IO and message activity during early regroup */
MMResumeAllIO ResumeIOCallback; /*Callback to resume all IO and message activity after PRUNING stage */
MMMsgCleanup1 MsgCleanup1Callback; /*Callback for Phase1 Message system cleanup from down node */
MMMsgCleanup2 MsgCleanup2Callback; /*Callback for Phase2 Message system cleanup to down node */
MMHalt HaltCallback; /*Callback to announce internal error or Poison packet or cluster ejection */
MMJoinFailed JoinFailedCallback; /*Callback to announce failure to join cluster. Retry required */
MMNodesDown NodesDownCallback; /* Callback to announce failure of one or more nodes.*/
cluster_t CPUUPMASK; /* Bitmask of UP Nodes for consistent Info api */
cluster_t NeedsNodeDownCallback; /* node(s) went down, need to do UpDown callback */
cluster_t Banished; /* mask of banished nodes */
HANDLE Stabilized; /* event which is set when the regroup is not active */
BOOL ArbitrationInProgress; /* it is set to True while regroup waits for arbitate callback to return */
DWORD ArbitratingNode; /* MM_INVALID_NODE or the arbitrating node (last regroup)*/
DWORD ApproxArbitrationWinner; /* Like ArbitratingNode, but spans multiple regroups */
BOOL ShuttingDown; /* indicate that a node is shutting done */
cluster_t MulticastReachable; /* indicate which nodes can be reachable via mcast */
#if defined( TDM_DEBUG )
rgp_debug_t debug; /* for debugging purposes */
#endif
} OS_specific_rgp_control_t;
extern DWORD QuorumOwner; /* updated by SetQuorumOwner and successful arbitrator*/
/* this variable can be set by the first node coming up before Mm is initialized */
/* Variables and routines provided by the srgpsvr.c driver program */
extern unsigned int alarm_period;
//extern void alarm_handler(void);
//extern void (*alarm_callback)();
extern void rgp_send(node_t node, void *data, int datasize);
extern void rgp_msgsys_work();
#endif /* NT */
/*----------------------------end of NT section----------------------------*/
#ifdef __cplusplus
}
#endif /* __cplusplus */
#if 0
History of changes to this file:
-------------------------------------------------------------------------
1995, December 13 F40:KSK0610 /*F40:KSK06102.1*/
This file is part of the portable Regroup Module used in the NonStop
Kernel (NSK) and Loosely Coupled UNIX (LCU) operating systems. There
are 10 files in the module - jrgp.h, jrgpos.h, wrgp.h, wrgpos.h,
srgpif.c, srgpos.c, srgpsm.c, srgputl.c, srgpcli.c and srgpsvr.c.
The last two are simulation files to test the Regroup Module on a
UNIX workstation in user mode with processes simulating processor nodes
and UDP datagrams used to send unacknowledged datagrams.
This file was first submitted for release into NSK on 12/13/95.
------------------------------------------------------------------------------
#endif /* 0 - change descriptions */
#endif /* _WRGPOS_H_ defined */