#ifndef ___OS_H_
#define ___OS_H_
#ifdef __cplusplus
extern "C"
{
#endif
typedef int BOOL;
#define FALSE 0
#define TRUE 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef __VMS
#pragma pointer_size save
#pragma pointer_size 32
typedef char* charPtr32;
typedef void* ptr32;
#pragma pointer_size 64
typedef char* charPtr64;
typedef void* ptr64;
#pragma pointer_size restore
#if __INITIAL_POINTER_SIZE==64
typedef charPtr64 charPtr;
typedef ptr64 ptr;
#define INIT_OS_ARGS(argc, argv, argVOS) \
static int __free_os_args; \
static charPtr* __argVOS_g; \
__free_os_args = getArgVOS(argc, argv, (ptr*)&argVOS); \
__argVOS_g = argVOS
#else
typedef charPtr32 charPtr;
typedef ptr32 ptr;
#define INIT_OS_ARGS(argc, argv, argVOS) \
static int __free_os_args=0; \
static charPtr* __argVOS_g=NULL; \
argVOS = argv
#endif
#define FREE_OS_ARGS \
if(__free_os_args) \
{ \
free(__argVOS_g); \
}
#else
typedef void* ptr;
typedef ptr ptr32;
typedef ptr ptr64;
typedef char* charPtr;
typedef charPtr charPtr32;
typedef charPtr charPtr64;
#define INIT_OS_ARGS(argc, argv, argVOS) argVOS=argv
#define FREE_OS_ARGS
#endif
#ifdef WIN32
#define _WIN32_WINNT 0x400
#include <winsock2.h>
#include <windows.h>
#include "getopt.h"
#else
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/time.h>
#include <sys/resource.h>
#if !defined(__VMS) && !defined(SOLCLIENT_AIX_BUILD) && !defined(SOLCLIENT_ZTPF_BUILD) && !defined(SOLCLIENT_HPUX_BUILD)
#include <getopt.h>
#include <sys/syscall.h>
#else
#include "getopt.h"
#endif
#include <netinet/in.h>
#endif
#ifdef WIN32
# define strncpy(dest_p, src_p, size) (strncpy_s(dest_p, size, src_p, _TRUNCATE))
# define strcasecmp (_stricmp)
# define strncasecmp (_strnicmp)
# define snprintf(buf_p, size, ...) (_snprintf_s(buf_p, size, _TRUNCATE, __VA_ARGS__))
# define vsnprintf(buf_p, size, ...) (_vsnprintf_s(buf_p, size, _TRUNCATE, __VA_ARGS__))
typedef DWORD threadRetType;
# define DEFAULT_THREAD_RETURN_ARG (0)
typedef DWORD pthread_t;
# define write(fd, buf_p, len) (send(fd, buf_p, (int)len, 0))
# define read(fd, buf_p, len) (recv(fd, buf_p, (int)len, 0))
# define close (closesocket)
typedef unsigned int ssize_t;
# define FOPEN(fd, fname, mode) (fopen_s(&fd, fname, mode))
typedef LPTHREAD_START_ROUTINE threadFn_pt;
#else
typedef void *threadRetType;
# define DEFAULT_THREAD_RETURN_ARG (NULL)
#if !defined(SOLCLIENT_AIX_BUILD) && !defined(SOLCLIENT_HPUX_BUILD)
# define FOPEN(fd, fname, mode) fd = fopen(fname, mode)
#endif
typedef threadRetType ( *threadFn_pt ) ( void *param_p );
#endif
#if !defined(SOLCLIENT_AIX_BUILD) && !defined(SOLCLIENT_HPUX_BUILD)
#if !defined(ntohll) // don't change OS defined ntohll
#define ntohll(x) (((INT64)(ntohl((int)((x << 32) >> 32))) << 32) | (unsigned int)ntohl(((int)(x >> 32))))
#define htonll(x) ntohll(x)
#endif
#endif
#ifdef WIN32
typedef unsigned __int64 UINT64;
typedef HANDLE MUTEX_T;
#define PTHREAD_MUTEX_INITIALIZER (NULL)
typedef HANDLE CONDITION_T;
#define PTHREAD_COND_INITIALIZER (NULL)
typedef HANDLE SEM_T;
typedef HANDLE THREAD_HANDLE_T;
#elif defined(DARWIN_OS)
typedef uint64_t UINT64;
typedef pthread_mutex_t MUTEX_T;
typedef struct {
char name[9];
sem_t *semaphore;
} SEM_T;
typedef pthread_t THREAD_HANDLE_T;
typedef pthread_cond_t CONDITION_T;
#else
typedef unsigned long long UINT64;
typedef pthread_mutex_t MUTEX_T;
typedef sem_t SEM_T;
typedef pthread_t THREAD_HANDLE_T;
typedef pthread_cond_t CONDITION_T;
#endif
extern SEM_T ctlCSem;
extern BOOL gotCtlC;
void initSigHandler ( void );
int getArgVOS(int argc, charPtr32* argv, ptr* argVOS);
void sleepInSec ( int secToSleep );
void sleepInUs ( int usToSleep );
UINT64 getTimeInUs ( void );
void _getDateTime ( char *buf_p, int bufSize );
UINT64 waitUntil ( UINT64 nexttimeInUs );
void getUsageTime ( long long *userTime_p, long long *systemTime_p );
UINT64 getCpuSpeedInHz ( void );
BOOL mutexInit ( MUTEX_T * mutex_p );
BOOL mutexDestroy ( MUTEX_T * mutex_p );
BOOL mutexLock ( MUTEX_T * mutex_p );
BOOL mutexUnlock ( MUTEX_T * mutex_p );
BOOL condInit ( CONDITION_T * cond_p );
BOOL condReset ( CONDITION_T * cond_p );
BOOL condWait ( CONDITION_T * cond_p, MUTEX_T * mutex_p );
BOOL condDestroy ( CONDITION_T * cond_p );
BOOL condTimedWait ( CONDITION_T * cond_p, MUTEX_T * mutex_p, int timeoutSec
);
BOOL condSignal ( CONDITION_T * cond_p );
BOOL semInit ( SEM_T * sem_p, unsigned int initValue, unsigned int maxValue );
BOOL semDestroy ( SEM_T * sem_p );
BOOL semWait ( SEM_T * sem_p );
BOOL semPost ( SEM_T * sem_p );
#define _NULL_THREAD_ID (0)
#ifdef WIN32
typedef void FP ( void * );
#else
typedef void *( *FP ) ( void * );
#endif
THREAD_HANDLE_T startThread ( FP fp, void *arg );
void waitOnThread ( THREAD_HANDLE_T handle );
#ifdef __cplusplus
}
#endif
#endif