diff options
Diffstat (limited to 'ace/os_include/psos.h')
-rw-r--r-- | ace/os_include/psos.h | 567 |
1 files changed, 567 insertions, 0 deletions
diff --git a/ace/os_include/psos.h b/ace/os_include/psos.h new file mode 100644 index 00000000000..97c398436e7 --- /dev/null +++ b/ace/os_include/psos.h @@ -0,0 +1,567 @@ +/* -*- C++ -*- */ + +//============================================================================= +/** + * @file psos.h + * + * $Id$ + * + * @author Douglas C. Schmidt (schmidt@cs.wustl.edu) + * @author etc + */ +//============================================================================= + +#ifndef ACE_OS_INCLUDE_PSOS_H +# define ACE_OS_INCLUDE_PSOS_H +# include "ace/pre.h" + +# include "ace/config-all.h" + +# if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +# endif /* ACE_LACKS_PRAGMA_ONCE */ + +// @todo: Integrate all this into the regular system include wrappers +// and get rid of this file.. + +# if defined (ACE_PSOS_SNARFS_HEADER_INFO) + // Header information snarfed from compiler provided header files + // that are not included because there is already an identically + // named file provided with pSOS, which does not have this info + // from compiler supplied stdio.h + extern FILE *fdopen(int, const char *); + extern int getopt(int, char *const *, const char *); + extern char *tempnam(const char *, const char *); + extern "C" int fileno(FILE *); + +// #define fileno(stream) ((stream)->_file) + + // from compiler supplied string.h + extern char *strdup (const char *); + + // from compiler supplied stat.h + extern mode_t umask (mode_t); + extern int mkfifo (const char *, mode_t); + extern int mkdir (const char *, mode_t); + + // from compiler supplied stdlib.h + extern int putenv (char *); + + int isatty (int h); + +# endif /* ACE_PSOS_SNARFS_HEADER_INFO */ + + +# if defined (ACE_PSOS) +// Some versions of pSOS do not define error numbers, but newer +// versions do. So, include errno.h and then see which ones are not +// yet defined. +# if !defined (EPERM) +# define EPERM 1 /* Not super-user */ +# endif /* EPERM */ +# if !defined (ENOENT) +# define ENOENT 2 /* No such file or directory */ +# endif /* ENOENT */ +# if !defined (ESRCH) +# define ESRCH 3 /* No such process */ +# endif /* ESRCH */ +# if ! defined (EINTR) +# define EINTR 4 /* interrupted system call */ +# endif /* EINTR */ +# if !defined (EBADF) +# define EBADF 9 /* Bad file number */ +# endif /* EBADF */ +# if !defined (EAGAIN) +# define EAGAIN 11 /* Resource temporarily unavailable */ +# endif /* EAGAIN */ +# if !defined (EWOULDBLOCK) +# define EWOULDBLOCK EAGAIN /* Blocking resource request would block */ +# endif /* EWOULDBLOCK */ +# if !defined (ENOMEM) +# define ENOMEM 12 /* Not enough core */ +# endif /* ENOMEM */ +# if !defined (EACCESS) +# define EACCESS 13 /* Permission denied */ +# endif /* EACCESS */ +# if !defined (EFAULT) +# define EFAULT 14 /* Bad access */ +# endif /* EFAULT */ +# if !defined (EEXIST) +# define EEXIST 17 /* File exists */ +# endif /* EEXIST */ +# if !defined (ENOSPC) +# define ENOSPC 28 /* No space left on device */ +# endif /* ENOSPC */ +# if !defined (EPIPE) +# define EPIPE 32 /* Broken pipe */ +# endif /* EPIPE */ +# if !defined (ETIME) +# define ETIME 62 /* timer expired */ +# endif /* ETIME */ +# if !defined (ENAMETOOLONG) +# define ENAMETOOLONG 78 /* path name is too long */ +# endif /* ENAMETOOLONG */ +# if !defined (ENOSYS) +# define ENOSYS 89 /* Unsupported file system operation */ +# endif /* ENOSYS */ +# if !defined (EADDRINUSE) +# define EADDRINUSE 125 /* Address already in use */ +# endif /* EADDRINUSE */ +# if !defined (ENETUNREACH) +# define ENETUNREACH 128 /* Network is unreachable */ +# endif /* ENETUNREACH */ +# if !defined (EISCONN) +# define EISCONN 133 /* Socket is already connected */ +# endif /* EISCONN */ +# if !defined (ESHUTDOWN) +# define ESHUTDOWN 143 /* Can't send after socket shutdown */ +# endif /* ESHUTDOWN */ +# if !defined (ECONNREFUSED) +# define ECONNREFUSED 146 /* Connection refused */ +# endif /* ECONNREFUSED */ +# if !defined (EINPROGRESS) +# define EINPROGRESS 150 /* operation now in progress */ +# endif /* EINPROGRESS */ +# if !defined (ERRMAX) +# define ERRMAX 151 /* Last error number */ +# endif /* ERRMAX */ +# endif /* ACE_PSOS */ + + + +# if defined (ACE_PSOS) + +// Wrapper for NT events on pSOS. +class ACE_OS_Export ACE_event_t +{ + friend class ACE_OS; + +protected: + + /// Protect critical section. + ACE_mutex_t lock_; + + /// Keeps track of waiters. + ACE_cond_t condition_; + + /// Specifies if this is an auto- or manual-reset event. + int manual_reset_; + + /// "True" if signaled. + int is_signaled_; + + /// Number of waiting threads. + u_long waiting_threads_; +}; + +# endif /* ACE_PSOS */ + + + +# if defined (ACE_PSOS) + +# if defined (ACE_PSOSIM) + +# include /**/ "ace/sys_conf.h" /* system configuration file */ +# include /**/ <psos.h> /* pSOS+ system calls */ +# include /**/ <pna.h> /* pNA+ TCP/IP Network Manager calls */ + + /* In the *simulator* environment, use unsigned int for size_t */ +# define size_t unsigned int + + + /* include <rpc.h> pRPC+ Remote Procedure Call Library calls */ + /* are not supported by pSOSim */ + /* */ + /* include <phile.h> pHILE+ file system calls are not supported */ + /* by pSOSim *so*, for the time being, we make */ + /* use of UNIX file system headers and then */ + /* when we have time, we wrap UNIX file system */ + /* calls w/ pHILE+ wrappers, and modify ACE to */ + /* use the wrappers under pSOSim */ + + /* put includes for necessary UNIX file system calls here */ +# include /**/ <sys/stat.h> +# include /**/ <sys/ioctl.h> +# include /**/ <sys/sockio.h> +# include /**/ <netinet/tcp.h> + +# define TCP_ +# if ! defined (BUFSIZ) +# define BUFSIZ 1024 +# endif /* ! defined (BUFSIZ) */ + + +# else + +# if defined (ACE_PSOS_CANT_USE_SYS_TYPES) + // these are missing from the pSOS types.h file, and the compiler + // supplied types.h file collides with the pSOS version. +# if !defined (ACE_SHOULD_NOT_DEFINE_SYS_TYPES) + typedef unsigned char u_char; + typedef unsigned short u_short; +# endif /* ACE_SHOULD_NOT_DEFINE_SYS_TYPES */ + typedef unsigned int u_int; +# if !defined (ACE_SHOULD_NOT_DEFINE_SYS_TYPES) + typedef unsigned long u_long; +# endif /* ACE_SHOULD_NOT_DEFINE_SYS_TYPES */ + + // These are defined in types.h included by (among others) pna.h +# if 0 + typedef unsigned char uchar_t; + typedef unsigned short ushort_t; + typedef unsigned int uint_t; + typedef unsigned long ulong_t; +# endif /* 0 */ + typedef char * caddr_t; + +# if defined (ACE_PSOS_DIAB_PPC) + // pid_t is defined in sys/types.h +# if 0 + typedef unsigned long pid_t; +# endif /* 0 */ +# define ACE_INVALID_PID ((pid_t) ~0) +# else /* !defined (ACE_PSOS_DIAB_PPC) */ + typedef long pid_t; +# define ACE_INVALID_PID ((pid_t) -1) +# endif /* defined (ACE_PSOS_DIAB_PPC) */ + +// typedef unsigned char wchar_t; +# endif /* ACE_PSOS_CANT_USE_SYS_TYPES */ + +# include /**/ "ace/sys_conf.h" /* system configuration file */ +# include /**/ <configs.h> /* includes all pSOS headers */ +// #include /**/ <psos.h> /* pSOS system calls */ +# include /**/ <pna.h> /* pNA+ TCP/IP Network Manager calls */ +# include /**/ <phile.h> /* pHILE+ file system calls */ +// #include /**/ <prepccfg.h> /* pREPC+ file system calls */ +# if defined (ACE_PSOS_DIAB_MIPS) +# if defined (ACE_PSOS_USES_DIAB_SYS_CALLS) +# include /**/ <unistd.h> /* Diab Data supplied file system calls */ +# else +# include /**/ <prepc.h> +# endif /* ACE_PSOS_USES_DIAB_SYS_CALLS */ +# include /**/ <sys/wait.h> /* Diab Data supplied header file */ +# endif /* ACE_PSOS_DIAB_MIPS */ + +// This collides with phile.h +// #include /**/ <sys/stat.h> /* Diab Data supplied header file */ + +// Some versions have missing preprocessor definitions +# if !defined (AF_UNIX) +# define AF_UNIX 0x1 +# endif /* AF_UNIX */ +# define PF_UNIX AF_UNIX +# define PF_INET AF_INET +# if !defined (AF_MAX) +# define AF_MAX AF_INET +# endif /* AF_MAX */ +# if !defined (IFF_LOOPBACK) +# define IFF_LOOPBACK IFF_EXTLOOPBACK +# endif /* IFF_LOOPBACK */ + + typedef long fd_mask; +# define IPPORT_RESERVED 1024 +# define IPPORT_USERRESERVED 5000 + + extern "C" + { + typedef void (* ACE_SignalHandler) (void); + typedef void (* ACE_SignalHandlerV) (void); + } + +# if !defined(SIG_DFL) +# define SIG_DFL (ACE_SignalHandler) 0 +# endif /* philabs */ + +# endif /* defined (ACE_PSOSIM) */ + + +# if ! defined (NSIG) +# define NSIG 32 +# endif /* NSIG */ + +# if ! defined (TCP_NODELAY) +# define TCP_NODELAY 1 +# endif /* TCP_NODELAY */ + +// For general purpose portability + +# define ACE_BITS_PER_ULONG (8 * sizeof (u_long)) + +typedef u_long ACE_idtype_t; +typedef u_long ACE_id_t; +# define ACE_SELF (0) +typedef u_long ACE_pri_t; + +// pHILE+ calls the DIR struct XDIR instead +# if !defined (ACE_PSOS_DIAB_PPC) +typedef XDIR ACE_DIR; +# endif /* !defined (ACE_PSOS_DIAB_PPC) */ + +// Use pSOS semaphores, wrapped . . . +typedef struct +{ + u_long sema_; + // Semaphore handle. This is allocated by pSOS. + + char name_[4]; + // Name of the semaphore: really a 32 bit number to pSOS +} ACE_sema_t; + +// Used for dynamic linking. +# if !defined (ACE_DEFAULT_SVC_CONF) +# define ACE_DEFAULT_SVC_CONF "./svc.conf" +# endif /* ACE_DEFAULT_SVC_CONF */ + +# if !defined (ACE_DEFAULT_SEM_KEY) +# define ACE_DEFAULT_SEM_KEY 1234 +# endif /* ACE_DEFAULT_SEM_KEY */ + +# define ACE_STDIN 0 +# define ACE_STDOUT 1 +# define ACE_STDERR 2 + +# define ACE_DIRECTORY_SEPARATOR_STR_A "/" +# define ACE_DIRECTORY_SEPARATOR_CHAR_A '/' +# define ACE_PLATFORM_A "pSOS" +# define ACE_PLATFORM_EXE_SUFFIX_A "" + +# define ACE_DLL_SUFFIX ACE_LIB_TEXT (".so") +# define ACE_DLL_PREFIX ACE_LIB_TEXT ("lib") +# define ACE_LD_SEARCH_PATH ACE_LIB_TEXT ("LD_LIBRARY_PATH") +# define ACE_LD_SEARCH_PATH_SEPARATOR_STR ACE_LIB_TEXT (":") +# define ACE_LOGGER_KEY ACE_LIB_TEXT ("/tmp/server_daemon") + +# define ACE_MAX_DEFAULT_PORT 65535 + +# if ! defined(MAXPATHLEN) +# define MAXPATHLEN 1024 +# endif /* MAXPATHLEN */ + +# if ! defined(MAXNAMLEN) +# define MAXNAMLEN 255 +# endif /* MAXNAMLEN */ + +# if defined (ACE_LACKS_MMAP) +# define PROT_READ 0 +# define PROT_WRITE 0 +# define PROT_EXEC 0 +# define PROT_NONE 0 +# define PROT_RDWR 0 +# define MAP_PRIVATE 0 +# define MAP_SHARED 0 +# define MAP_FIXED 0 +# endif /* ACE_LACKS_MMAP */ + + +typedef int ACE_exitcode; + +typedef ACE_HANDLE ACE_SHLIB_HANDLE; +# define ACE_SHLIB_INVALID_HANDLE ACE_INVALID_HANDLE +# define ACE_DEFAULT_SHLIB_MODE 0 + +# define ACE_INVALID_SEM_KEY -1 + +struct hostent { + char *h_name; /* official name of host */ + char **h_aliases; /* alias list */ + int h_addrtype; /* host address type */ + int h_length; /* address length */ + char **h_addr_list; /* (first, only) address from name server */ +# define h_addr h_addr_list[0] /* the first address */ +}; + +struct servent { + char *s_name; /* official service name */ + char **s_aliases; /* alias list */ + int s_port; /* port # */ + char *s_proto; /* protocol to use */ +}; + +# define ACE_SEH_TRY if (1) +# define ACE_SEH_EXCEPT(X) while (0) +# define ACE_SEH_FINALLY if (1) + +# if !defined (LPSECURITY_ATTRIBUTES) +# define LPSECURITY_ATTRIBUTES int +# endif /* !defined LPSECURITY_ATTRIBUTES */ +# if !defined (GENERIC_READ) +# define GENERIC_READ 0 +# endif /* !defined GENERIC_READ */ +# if !defined (FILE_SHARE_READ) +# define FILE_SHARE_READ 0 +# endif /* !defined FILE_SHARE_READ */ +# if !defined (OPEN_EXISTING) +# define OPEN_EXISTING 0 +# endif /* !defined OPEN_EXISTING */ +# if !defined (FILE_ATTRIBUTE_NORMAL) +# define FILE_ATTRIBUTE_NORMAL 0 +# endif /* !defined FILE_ATTRIBUTE_NORMAL */ +# if !defined (MAXIMUM_WAIT_OBJECTS) +# define MAXIMUM_WAIT_OBJECTS 0 +# endif /* !defined MAXIMUM_WAIT_OBJECTS */ +# if !defined (FILE_FLAG_OVERLAPPED) +# define FILE_FLAG_OVERLAPPED 0 +# endif /* !defined FILE_FLAG_OVERLAPPED */ +# if !defined (FILE_FLAG_SEQUENTIAL_SCAN) +# define FILE_FLAG_SEQUENTIAL_SCAN 0 +# endif /* !defined FILE_FLAG_SEQUENTIAL_SCAN */ + +struct ACE_OVERLAPPED +{ + u_long Internal; + u_long InternalHigh; + u_long Offset; + u_long OffsetHigh; + ACE_HANDLE hEvent; +}; + +# if !defined (USER_INCLUDE_SYS_TIME_TM) +# if defined (ACE_PSOS_DIAB_PPC) +typedef struct timespec timespec_t; +# else /* ! defined (ACE_PSOS_DIAB_PPC) */ +typedef struct timespec +{ + time_t tv_sec; // Seconds + long tv_nsec; // Nanoseconds +} timespec_t; +# endif /* defined (ACE_PSOS_DIAB_PPC) */ +# endif /* !defined (USER_INCLUDE_SYS_TIME_TM) */ + +# if defined (ACE_PSOS_HAS_TIME) + +// Use pSOS time, wrapped . . . +class ACE_OS_Export ACE_PSOS_Time_t +{ +public: + /// default ctor: date, time, and ticks all zeroed. + ACE_PSOS_Time_t (void); + + /// ctor from a timespec_t + ACE_PSOS_Time_t (const timespec_t& t); + + /// type cast operator (to a timespec_t) + operator timespec_t (); + + /// static member function to get current system time + static u_long get_system_time (ACE_PSOS_Time_t& t); + + /// static member function to set current system time + static u_long set_system_time (const ACE_PSOS_Time_t& t); + +# if defined (ACE_PSOSIM) + /// static member function to initialize system time, using UNIX calls + static u_long init_simulator_time (void); +# endif /* ACE_PSOSIM */ + + /// max number of ticks supported in a single system call + static const u_long max_ticks; +private: + // = Constants for prying info out of the pSOS time encoding. + static const u_long year_mask; + static const u_long month_mask; + static const u_long day_mask; + static const u_long hour_mask; + static const u_long minute_mask; + static const u_long second_mask; + static const int year_shift; + static const int month_shift; + static const int hour_shift; + static const int minute_shift; + static const int year_origin; + static const int month_origin; + + // error codes + static const u_long err_notime; // system time not set + static const u_long err_illdate; // date out of range + static const u_long err_illtime; // time out of range + static const u_long err_illticks; // ticks out of range + + /// date : year in bits 31-16, month in bits 15-8, day in bits 7-0 + u_long date_; + + /// time : hour in bits 31-16, minutes in bits 15-8, seconds in bits 7-0 + u_long time_; + + /// ticks: number of system clock ticks (KC_TICKS2SEC-1 max) + u_long ticks_; +} ; +# endif /* ACE_PSOS_HAS_TIME */ + +# endif /* defined (ACE_PSOS) */ + +# if defined (ACE_HAS_THREADS) + +// Some versions of pSOS provide native mutex support. For others, +// implement ACE_thread_mutex_t and ACE_mutex_t using pSOS semaphores. +// Either way, the types are all u_longs. +typedef u_long ACE_mutex_t; +typedef u_long ACE_thread_mutex_t; +typedef u_long ACE_thread_t; +typedef u_long ACE_hthread_t; + +# if defined (ACE_PSOS_HAS_COND_T) +typedef u_long ACE_cond_t; +typedef u_long ACE_condattr_t; +struct ACE_OS_Export ACE_mutexattr_t +{ + int type; +}; +# endif /* ACE_PSOS_HAS_COND_T */ + + +// TCB registers 0-7 are for application use +# define PSOS_TASK_REG_TSS 0 +# define PSOS_TASK_REG_MAX 7 + +# define PSOS_TASK_MIN_PRIORITY 1 +# define PSOS_TASK_MAX_PRIORITY 239 + +// Key type: the ACE TSS emulation requires the key type be unsigned, +// for efficiency. Current POSIX and Solaris TSS implementations also +// use unsigned int, so the ACE TSS emulation is compatible with them. +// Native pSOS TSD, where available, uses unsigned long as the key type. +# if defined (ACE_PSOS_HAS_TSS) +typedef u_long ACE_thread_key_t; +# else +typedef u_int ACE_thread_key_t; +# endif /* ACE_PSOS_HAS_TSS */ + +# define THR_CANCEL_DISABLE 0 /* thread can never be cancelled */ +# define THR_CANCEL_ENABLE 0 /* thread can be cancelled */ +# define THR_CANCEL_DEFERRED 0 /* cancellation deferred to cancellation point */ +# define THR_CANCEL_ASYNCHRONOUS 0 /* cancellation occurs immediately */ + +# define THR_BOUND 0 +# define THR_NEW_LWP 0 +# define THR_DETACHED 0 +# define THR_SUSPENDED 0 +# define THR_DAEMON 0 +# define THR_JOINABLE 0 + +# define THR_SCHED_FIFO 0 +# define THR_SCHED_RR 0 +# define THR_SCHED_DEFAULT 0 +# define USYNC_THREAD T_LOCAL +# define USYNC_PROCESS T_GLOBAL + +/* from psos.h */ +/* #define T_NOPREEMPT 0x00000001 Not preemptible bit */ +/* #define T_PREEMPT 0x00000000 Preemptible */ +/* #define T_TSLICE 0x00000002 Time-slicing enabled bit */ +/* #define T_NOTSLICE 0x00000000 No Time-slicing */ +/* #define T_NOASR 0x00000004 ASRs disabled bit */ +/* #define T_ASR 0x00000000 ASRs enabled */ + +/* #define SM_GLOBAL 0x00000001 1 = Global */ +/* #define SM_LOCAL 0x00000000 0 = Local */ +/* #define SM_PRIOR 0x00000002 Queue by priority */ +/* #define SM_FIFO 0x00000000 Queue by FIFO order */ + +/* #define T_NOFPU 0x00000000 Not using FPU */ +/* #define T_FPU 0x00000002 Using FPU bit */ +# endif /* ACE_HAS_THREADS */ + + +#endif /* ACE_OS_INCLUDE_PSOS_H */ |