fis-gtm/sr_unix/mdefsp.h

275 lines
8.0 KiB
C

/****************************************************************
* *
* Copyright 2001, 2011 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#ifndef MDESP_included
#define MDESP_included
#include <sys/types.h>
#if defined(__ia64) || defined(__x86_64__) || defined(__sparc) || defined(__s390__)
#define GTM64
#endif /* __ia64 */
#ifdef GTM64
typedef long int8; /* 8-byte signed integer */
typedef unsigned long uint8; /* 8-byte unsigned integer */
typedef unsigned long gtm_uint8; /*these two datatypes are defined because */
typedef long gtm_int8; /*int8 and uint8 are system defined in AIX_64*/
#define INT8_NATIVE
#endif
#ifdef __s390__
typedef short int2; /* 2-byte signed integer */
typedef unsigned short uint2; /* 2-byte unsigned integer */
#define LINKAGE_PSECT_BOUNDARY 8
typedef uint2 mach_inst;
#endif
#define INT8_SUPPORTED
#define INT8_FMT "%llu"
#define INT8_FMTX "[0x%llx]"
#define UNICODE_SUPPORTED
/* Starting off life as debugging parms and now we need them for the
short term so define them here */
#define DEBUG_LEAVE_SM
#define DEBUG_NOMSYNC
#define readonly
#define GBLDEF
#define GBLREF extern
#define LITDEF const
#define LITREF extern const
#define error_def(x) LITREF int x
#define UNIX 1
#undef VMS
#define BIGENDIAN 1
#define CNTR_WORD_32
#ifdef __sparc
#define CACHELINE_SIZE 256
#define MSYNC_ADDR_INCS OS_PAGE_SIZE
#define USHBIN_SUPPORTED
#define LINKAGE_PSECT_BOUNDARY 8
#define OFF_T_LONG
#define INO_T_LONG
#define MUTEX_MSEM_WAKE
#define POSIX_MSEM
#undef sssize_t
#define sssize_t ssize_t
#undef SHMDT
#define SHMDT(X) shmdt((char *)(X))
typedef uint4 mach_inst;
/* Use rc_mval2subsc only for sun until every DTM client (that needs 16-bit precision as opposed to 18-bit for GT.M) is gone */
#define mval2subsc rc_mval2subsc
#ifndef VAR_COPY
#define VAR_COPY va_copy
#endif
#endif /* __sparc */
#if defined(__ia64)
#define CACHELINE_SIZE 128
#define INO_T_LONG /* define this for both Linux ia64 and HPUX ia64 as these are 64-bit builds */
#elif defined(__hppa)
#define CACHELINE_SIZE 64
#endif /* __ia64 */
#ifdef __hpux
#define MSYNC_ADDR_INCS OS_PAGE_SIZE
#define MUTEX_MSEM_WAKE
#define POSIX_MSEM
#define USHBIN_SUPPORTED
#define OFF_T_LONG
/* Make sure linkage Psect is aligned on appropriate boundary. */
#ifdef __ia64
#define LINKAGE_PSECT_BOUNDARY 8
#else
#define LINKAGE_PSECT_BOUNDARY 4
#endif //__ia64
typedef uint4 mach_inst; /* machine instruction */
#endif /* __hpux */
#if defined(__linux__) || defined(__CYGWIN__)
#define OFF_T_LONG
#ifdef NeedInAddrPort
typedef unsigned short in_port_t;
#endif
#ifndef VAR_COPY
#define VAR_COPY(dst,src) __va_copy(dst, src)
#endif
#ifdef __s390__
#ifndef Linux390
#define Linux390
#endif
#define INO_T_LONG /* see gdsfhead.h, actually for dev_t == 8 on Linux390 2.2.15 */
#endif /* __s390__ */
#endif /* __linux__ */
#ifdef __linux__
#define SYS_ERRLIST_INCLUDE "gtm_stdio.h"
/* For 32-bit linux in i386, we noticed during the RHEL 5.5 upgrade that using msems affects process wakeup times
* dramatically enough to cause test hangs/failures. Not sure if it is a linux kernel or package issue.
* Therefore disabling msems on that platform for now until we know better. The alternative is socket waits (using
* select/poll system call). Performance differences, if any, is expected to be only a marginally slowdown.
*/
# ifndef __i386
# define MUTEX_MSEM_WAKE
# define POSIX_MSEM
# endif
#endif
#ifdef __CYGWIN__
#ifdef UNICODE_SUPPORTED_OBEYED
#undef UNICODE_SUPPORTED
#endif
#define KEY_T_LONG /* 8 bytes */
#define SYS_ERRLIST_INCLUDE <errno.h>
#endif
#ifdef __s390__
#define CACHELINE_SIZE 256
#define GTM_CONTEXT(func) (unsigned char *)func
#define SSM_SIZE 256*1024*1024 /* Segments on 256M boundary */
#define SHMAT_ADDR_INCS SSM_SIZE
#define MSYNC_ADDR_INCS OS_PAGE_SIZE
#define USHBIN_SUPPORTED
#endif /* __s390__ */
#ifdef __ia64
# ifdef __linux__
# define MSYNC_ADDR_INCS OS_PAGE_SIZE
# undef BIGENDIAN
# define USHBIN_SUPPORTED
/* Make sure linkage Psect is aligned on appropriate boundary. */
# define LINKAGE_PSECT_BOUNDARY 8
typedef uint4 mach_inst; /* machine instruction */
# elif defined(__hpux)
void call_runtime();
void opp_dmode();
void dyncall();
# endif
#endif /* __ia64 */
#ifdef __i386
/* Through Pentium Pro/II/III, should use CPUID to get real value perhaps */
#define CACHELINE_SIZE 32
#define MSYNC_ADDR_INCS OS_PAGE_SIZE
#undef BIGENDIAN
typedef char mach_inst; /* machine instruction */
#endif /* __i386 */
#ifdef __x86_64__
#define CACHELINE_SIZE 64
#define MSYNC_ADDR_INCS OS_PAGE_SIZE
#define USHBIN_SUPPORTED
#define INO_T_LONG
/*
#define MUTEX_MSEM_WAKE
#define POSIX_MSEM
*/
#define LINKAGE_PSECT_BOUNDARY 8
#undef BIGENDIAN
typedef char mach_inst; /* machine instruction */
#endif
#ifdef Linux390
# define INTERLOCK_ADD(X,Y,Z) (interlock_add(Z, (sm_int_ptr_t)(X)))
#else
# define INTERLOCK_ADD(X,Y,Z) (add_inter(Z, (sm_int_ptr_t)(X), (sm_global_latch_ptr_t)(Y)))
#endif
/* On NON_USHBIN_ONLY platforms, reserve enough space in routine header for the dummy
* string "GTM_CODE". On USHBIN_ONLY platforms, reserve space of 16 bytes that holds
* instructions for simple 'return -1' plus as many characters of "GTM_CODE" as can be fit
* in the rest of the available bytes */
#if __ia64
#define RHEAD_JSB_SIZE 24 /* We need 16 bytes for putting the 'return -1' instruction + the GTM_CODE string */
#elif __x86_64__
#define RHEAD_JSB_SIZE 16 /* We need 8 bytes for putting the 'return -1' instruction + the GTM_CODE string */
#else
#define RHEAD_JSB_SIZE NON_USHBIN_ONLY(8) USHBIN_ONLY(16)
#endif /* __ia64 */
typedef struct
{
unsigned short mvtype;
#ifdef BIGENDIAN
unsigned sgn : 1;
unsigned e : 7;
#else
unsigned e : 7;
unsigned sgn : 1;
#endif
unsigned char fnpc_indx; /* Index to fnpc_work area this mval is using */
int4 m[2];
mstr str;
} mval;
/* Another version of mval struct with byte fields instead of bit fields */
typedef struct
{
unsigned short mvtype;
unsigned char sgne;
unsigned char fnpc_indx; /* Index to fnpc_work area this mval is using */
int4 m[2];
mstr str;
} mval_b;
#define VAR_START(a, b) va_start(a, b)
#define VARLSTCNT(a) a, /* push count of arguments*/
#define malloc gtm_malloc
#define free gtm_free
#ifndef __ia64
#define CODE_ADDRESS(func) (unsigned char *)func
#else
/* On IA64, there is a need to differentiate between generated code and regular
* functions. When regular function addresses are obtained, this macro is
* always used, and this will set the bottom two bits of the given address
* (which is actually the function descriptor/PLABEL). Later in call_runtime/dyncall,
* the bottom two bits will be checked and removed if required and a
* dereference will happen to extract the actual target address.
* This is done to mimic the behaviour of PLABEL/$$DYNCALL of HPPA on IA64.
*/
#define CODE_ADDRESS_C(func) ((unsigned char*) ((unsigned long)func | (unsigned long)0x3))
#define CODE_ADDRESS_ASM(func) ((unsigned char *) *(unsigned long *)func)
#define CODE_ADDRESS(func) CODE_ADDRESS_ASM(func)
#endif /* __ia64 */
#ifndef GTM_CONTEXT
#define GTM_CONTEXT(func) 0 /* not used on this target */
#endif
/* PSECT in which the address of the module is defined: */
#define GTM_MODULE_DEF_PSECT GTM_CODE
#define OS_PAGELET_SIZE 512
#define OS_VIRTUAL_BLOCK_SIZE OS_PAGELET_SIZE
#define GTM_MM_FLAGS MAP_SHARED
#ifndef SSM_SIZE
#define SSM_SIZE OS_PAGE_SIZE
#endif
typedef volatile int4 latch_t;
typedef volatile uint4 ulatch_t;
#define INSIDE_CH_SET "ISO8859-1"
#define OUTSIDE_CH_SET "ISO8859-1"
#define EBCDIC_SP 0x40
#define NATIVE_SP 0x20
#define DEFAULT_CODE_SET ascii /* enum ascii defined in io.h */
#endif /* MDESP_included */