/* -*- C++ -*- */ // $Id$ // ============================================================================ // // = LIBRARY // ace // // = FILENAME // OS.h // // = AUTHOR // Doug Schmidt <schmidt@cs.wustl.edu>, Jesper S. M|ller // <stophph@diku.dk>, and a cast of thousands... // // ============================================================================ #if !defined (ACE_OS_H) #define ACE_OS_H // This file should be a link to the platform/compiler-specific // configuration file (e.g., config-sunos5-sunc++-4.x.h). #include "ace/config.h" #if defined (ACE_HAS_4_4BSD_SENDMSG_RECVMSG) // control message size to pass a file descriptor #define ACE_BSD_CONTROL_MSG_LEN sizeof (struct cmsghdr) + sizeof (ACE_HANDLE) #endif /* ACE_HAS_4_4BSD_SENDMSG_RECVMSG */ // Define the default constants for ACE. Many of these are used for // the ACE tests and applications. You can change these values by // defining the macros in your config.h file. #if !defined (ACE_DEFAULT_TIMEOUT) #define ACE_DEFAULT_TIMEOUT 5 #endif /* ACE_DEFAULT_TIMEOUT */ #if !defined (ACE_DEFAULT_THREADS) #define ACE_DEFAULT_THREADS 1 #endif /* ACE_DEFAULT_THREADS */ // The following 3 defines are used in the IP multicast and broadcast tests. #if !defined (ACE_DEFAULT_BROADCAST_PORT) #define ACE_DEFAULT_BROADCAST_PORT 10000 #endif /* ACE_DEFAULT_BROADCAST_PORT */ #if !defined (ACE_DEFAULT_MULTICAST_PORT) #define ACE_DEFAULT_MULTICAST_PORT 10001 #endif /* ACE_DEFAULT_MULTICAST_PORT */ #if !defined (ACE_DEFAULT_MULTICAST_ADDR) #define ACE_DEFAULT_MULTICAST_ADDR "224.9.9.2" #endif /* ACE_DEFAULT_MULTICAST_ADDR */ // Default port number for HTTP. #if !defined (ACE_DEFAULT_HTTP_SERVER_PORT) #define ACE_DEFAULT_HTTP_SERVER_PORT 80 #endif /* ACE_DEFAULT_HTTP_SERVER_PORT */ // Used in many IPC_SAP tests #if !defined (ACE_DEFAULT_SERVER_PORT) #define ACE_DEFAULT_SERVER_PORT 10002 #endif /* ACE_DEFAULT_SERVER_PORT */ // Used in Acceptor tests #if !defined (ACE_DEFAULT_SERVER_PORT_STR) #define ACE_DEFAULT_SERVER_PORT_STR "10002" #endif /* ACE_DEFAULT_SERVER_PORT_STR */ // Used for the Service_Directory test #if !defined (ACE_DEFAULT_SERVICE_PORT) #define ACE_DEFAULT_SERVICE_PORT 10003 #endif /* ACE_DEFAULT_SERVICE_PORT */ // Used for the ACE_Thread_Spawn test #if !defined (ACE_DEFAULT_THR_PORT ) #define ACE_DEFAULT_THR_PORT 10004 #endif /* ACE_DEFAULT_THR_PORT */ // Used for SOCK_Connect::connect() tests #if !defined (ACE_DEFAULT_LOCAL_PORT) #define ACE_DEFAULT_LOCAL_PORT 10005 #endif /* ACE_DEFAULT_LOCAL_PORT */ // Used for Connector tests #if !defined (ACE_DEFAULT_LOCAL_PORT_STR) #define ACE_DEFAULT_LOCAL_PORT_STR "10005" #endif /* ACE_DEFAULT_LOCAL_PORT_STR */ // Used for the name server. #if !defined (ACE_DEFAULT_NAME_SERVER_PORT) #define ACE_DEFAULT_NAME_SERVER_PORT 10006 #endif /* ACE_DEFAULT_NAME_SERVER_PORT */ #if !defined (ACE_DEFAULT_NAME_SERVER_PORT_STR) #define ACE_DEFAULT_NAME_SERVER_PORT_STR "10006" #endif /* ACE_DEFAULT_NAME_SERVER_PORT_STR */ // Used for the token server. #if !defined (ACE_DEFAULT_TOKEN_SERVER_PORT) #define ACE_DEFAULT_TOKEN_SERVER_PORT 10007 #endif /* ACE_DEFAULT_TOKEN_SERVER_PORT */ #if !defined (ACE_DEFAULT_TOKEN_SERVER_PORT_STR) #define ACE_DEFAULT_TOKEN_SERVER_PORT_STR "10007" #endif /* ACE_DEFAULT_TOKEN_SERVER_PORT_STR */ // Used for the logging server. #if !defined (ACE_DEFAULT_LOGGING_SERVER_PORT) #define ACE_DEFAULT_LOGGING_SERVER_PORT 10008 #endif /* ACE_DEFAULT_LOGGING_SERVER_PORT */ #if !defined (ACE_DEFAULT_LOGGING_SERVER_PORT_STR) #define ACE_DEFAULT_LOGGING_SERVER_PORT_STR "10008" #endif /* ACE_DEFAULT_LOGGING_SERVER_PORT_STR */ // Used for the logging server. #if !defined (ACE_DEFAULT_THR_LOGGING_SERVER_PORT) #define ACE_DEFAULT_THR_LOGGING_SERVER_PORT 10008 #endif /* ACE_DEFAULT_THR_LOGGING_SERVER_PORT */ #if !defined (ACE_DEFAULT_THR_LOGGING_SERVER_PORT_STR) #define ACE_DEFAULT_THR_LOGGING_SERVER_PORT_STR "10008" #endif /* ACE_DEFAULT_THR_LOGGING_SERVER_PORT_STR */ // Used for the gateway server. #if !defined (ACE_DEFAULT_GATEWAY_SERVER_PORT) #define ACE_DEFAULT_GATEWAY_SERVER_PORT 10009 #endif /* ACE_DEFAULT_GATEWAY_SERVER_PORT */ #if !defined (ACE_DEFAULT_GATEWAY_SERVER_PORT_STR) #define ACE_DEFAULT_GATEWAY_SERVER_PORT_STR "10009" #endif /* ACE_DEFAULT_GATEWAY_SERVER_PORT_STR */ // Used for the peer server. #if !defined (ACE_DEFAULT_PEER_SERVER_PORT) #define ACE_DEFAULT_PEER_SERVER_PORT 10010 #endif /* ACE_DEFAULT_PEER_SERVER_PORT */ #if !defined (ACE_DEFAULT_PEER_SERVER_PORT_STR) #define ACE_DEFAULT_PEER_SERVER_PORT_STR "10010" #endif /* ACE_DEFAULT_PEER_SERVER_PORT_STR */ // Used for the time server. #if !defined (ACE_DEFAULT_TIME_SERVER_PORT) #define ACE_DEFAULT_TIME_SERVER_PORT 10011 #endif /* ACE_DEFAULT_TIME_SERVER_PORT */ #if !defined (ACE_DEFAULT_TIME_SERVER_PORT_STR) #define ACE_DEFAULT_TIME_SERVER_PORT_STR "10011" #endif /* ACE_DEFAULT_TIME_SERVER_PORT_STR */ #if !defined (ACE_DEFAULT_TIME_SERVER_STR) #define ACE_DEFAULT_TIME_SERVER_STR "ACE_TS_TIME" #endif /* ACE_DEFAULT_TIME_SERVER_STR */ #if !defined (ACE_DEFAULT_SERVER_HOST) #define ACE_DEFAULT_SERVER_HOST "localhost" #endif /* ACE_DEFAULT_SERVER_HOST */ // Default shared memory key #if !defined (ACE_DEFAULT_SHM_KEY) #define ACE_DEFAULT_SHM_KEY 1234 #endif /* ACE_DEFAULT_SHM_KEY */ // Default segment size used by SYSV shared memory (128 K) #if !defined (ACE_DEFAULT_SEGMENT_SIZE) #define ACE_DEFAULT_SEGMENT_SIZE 1024 * 128 #endif /* ACE_DEFAULT_SEGMENT_SIZE */ // Maximum number of SYSV shared memory segments // (does anyone know how to figure out the right values?!) #if !defined (ACE_DEFAULT_MAX_SEGMENTS) #define ACE_DEFAULT_MAX_SEGMENTS 6 #endif /* ACE_DEFAULT_MAX_SEGMENTS */ // Used by the FIFO tests. #if !defined (ACE_DEFAULT_RENDEZVOUS) #define ACE_DEFAULT_RENDEZVOUS "/tmp/fifo.ace" #endif /* ACE_DEFAULT_RENDEZVOUS */ // Name of the map that's stored in shared memory. #if !defined (ACE_NAME_SERVER_MAP) #define ACE_NAME_SERVER_MAP "Name Server Map" #endif /* ACE_NAME_SERVER_MAP */ // Default file permissions. #if !defined (ACE_DEFAULT_FILE_PERMS) #define ACE_DEFAULT_FILE_PERMS 0666 #endif /* ACE_DEFAULT_FILE_PERMS */ // Default directory permissions. #if !defined (ACE_DEFAULT_DIR_PERMS) #define ACE_DEFAULT_DIR_PERMS 0777 #endif /* ACE_DEFAULT_DIR_PERMS */ // Default size of the ACE Reactor. #if !defined (ACE_DEFAULT_REACTOR_SIZE) #define ACE_DEFAULT_REACTOR_SIZE FD_SETSIZE #endif /* ACE_DEFAULT_REACTOR_SIZE */ // Default size of the ACE Map_Manager. #if !defined (ACE_DEFAULT_MAP_SIZE) #define ACE_DEFAULT_MAP_SIZE 1024 #endif /* ACE_DEFAULT_MAP_SIZE */ // Defaults for ACE Timer Wheel #if !defined (ACE_DEFAULT_TIMER_WHEEL_SIZE) #define ACE_DEFAULT_TIMER_WHEEL_SIZE 1024 #endif /* ACE_DEFAULT_TIMER_WHEEL_SIZE */ #if !defined (ACE_DEFAULT_TIMER_WHEEL_RESOLUTION) #define ACE_DEFAULT_TIMER_WHEEL_RESOLUTION 100 #endif /* ACE_DEFAULT_TIMER_WHEEL_RESOLUTION */ // Default size for ACE Timer Hash table #if !defined (ACE_DEFAULT_TIMER_HASH_TABLE_SIZE) #define ACE_DEFAULT_TIMER_HASH_TABLE_SIZE 1024 #endif /* ACE_DEFAULT_TIMER_HASH_TABLE_SIZE */ // Defaults for the ACE Free List #if !defined (ACE_DEFAULT_FREE_LIST_PREALLOC) #define ACE_DEFAULT_FREE_LIST_PREALLOC 0 #endif /* ACE_DEFAULT_FREE_LIST_PREALLOC */ #if !defined (ACE_DEFAULT_FREE_LIST_LWM) #define ACE_DEFAULT_FREE_LIST_LWM 0 #endif /* ACE_DEFAULT_FREE_LIST_LWM */ #if !defined (ACE_DEFAULT_FREE_LIST_HWM) #define ACE_DEFAULT_FREE_LIST_HWM 25000 #endif /* ACE_DEFAULT_FREE_LIST_HWM */ #if !defined (ACE_DEFAULT_FREE_LIST_INC) #define ACE_DEFAULT_FREE_LIST_INC 100 #endif /* ACE_DEFAULT_FREE_LIST_INC */ #if !defined (ACE_UNIQUE_NAME_LEN) #define ACE_UNIQUE_NAME_LEN 100 #endif /* ACE_UNIQUE_NAME_LEN */ // Here are all ACE-specific global declarations needed throughout // ACE. // Helpful dump macros. #define ACE_BEGIN_DUMP "\n====\n(%P|%t|%x)" #define ACE_END_DUMP "====\n" // A free list which create more elements when there aren't enough // elements. #define ACE_FREE_LIST_WITH_POOL 1 // A simple free list which doen't allocate/deallocate elements. #define ACE_PURE_FREE_LIST 2 // This is used to indicate that a platform doesn't support a // particular feature. #define ACE_NOTSUP_RETURN(FAILVALUE) do { errno = ENOTSUP ; return FAILVALUE; } while (0) #if defined (ACE_NDEBUG) #define ACE_DB(X) #else #define ACE_DB(X) X #endif /* ACE_NDEBUG */ // ACE_NO_HEAP_CHECK macro can be used to suppress false report of // memory leaks. It turns off the built-in heap checking until the // block is left. The old state will then be restored Only used for // Win32 (in the moment). #if defined (ACE_WIN32) #if defined (_DEBUG) class ACE_No_Heap_Check { public: ACE_No_Heap_Check (void) : old_state (_CrtSetDbgFlag (_CRTDBG_REPORT_FLAG)) { _CrtSetDbgFlag (old_state & ~_CRTDBG_ALLOC_MEM_DF);} ~ACE_No_Heap_Check (void) { _CrtSetDbgFlag (old_state);} private: int old_state; }; #define ACE_NO_HEAP_CHECK ACE_No_Heap_Check ____no_heap; #else /* !_DEBUG*/ #define ACE_NO_HEAP_CHECK #endif /* _DEBUG*/ #else /* !ACE_WIN32 */ #define ACE_NO_HEAP_CHECK #endif /* ACE_WIN32 */ // Increase the range of "address families". #define AF_SPIPE (AF_MAX + 1) #define AF_FILE (AF_MAX + 2) #define AF_DEV (AF_MAX + 3) #define AF_UPIPE (AF_SPIPE) // Turn a number into a string. #define ACE_ITOA(X) #X // Create a string of a server address with a "host:port" format. #define ACE_SERVER_ADDRESS(H,P) H":"P // A couple useful inline functions for checking whether bits are // enabled or disabled. // Efficiently returns the least power of two >= X... #define ACE_POW(X) ((!X)?1:(X-=1,X|=X>>1,X|=X>>2,X|=X>>4,X|=X>>8,X|=X>>16,(++X))) #define ACE_EVEN(NUM) (((NUM) & 1) == 0) #define ACE_ODD(NUM) (((NUM) & 1) == 1) #define ACE_BIT_ENABLED(WORD, BIT) (((WORD) & (BIT)) != 0) #define ACE_BIT_DISABLED(WORD, BIT) (((WORD) & (BIT)) == 0) #define ACE_SET_BITS(WORD, BITS) (WORD |= (BITS)) #define ACE_CLR_BITS(WORD, BITS) (WORD &= ~(BITS)) #define ACE_MAX(x,y) (((x)>(y))?(x):(y)) #define ACE_MIN(x,y) (((x)<(y))?(x):(y)) // Keep the compiler from complaining about parameters which are not used. #if defined (ghs) || (__GNUC__) || defined (__hpux) || defined (__sgi) // Some compilers complain about "statement with no effect" with (a). // This eliminates the warnings, and no code is generated for the null // conditional statement. NOTE: that may only be true if -O is enabled, // such as with GreenHills (ghs) 1.8.8. #define ACE_UNUSED_ARG(a) {if (&a) /* null */ ;} #else #define ACE_UNUSED_ARG(a) (a) #endif /* ghs */ #if defined (ACE_REQUIRES_FUNC_DEFINITIONS) // Provide a null definition for the function. Not pleasant. # define ACE_UNIMPLEMENTED_FUNC(f) f {} #else # define ACE_UNIMPLEMENTED_FUNC(f) f; #endif /* ACE_REQUIRES_FUNC_DEFINITIONS */ // These hooks enable ACE to have all dynamic memory management // automatically handled on a per-object basis. #if defined (ACE_HAS_ALLOC_HOOKS) #define ACE_ALLOC_HOOK_DECLARE \ void *operator new (size_t bytes); \ void operator delete (void *ptr); // Note that these are just place holders for now. They'll // be replaced by the ACE_Malloc stuff shortly... #define ACE_ALLOC_HOOK_DEFINE(CLASS) \ void *CLASS::operator new (size_t bytes) { return ::new char[bytes]; } \ void CLASS::operator delete (void *ptr) { delete (ptr); } #else #define ACE_ALLOC_HOOK_DECLARE struct __Ace {} /* Just need a dummy... */ #define ACE_ALLOC_HOOK_DEFINE(CLASS) #endif /* ACE_HAS_ALLOC_HOOKS */ #if defined (ACE_LACKS_KEY_T) #if defined (ACE_WIN32) // Win32 doesn't use numeric values to name its semaphores, it uses // strings! typedef char *key_t; #else typedef int key_t; #endif /* ACE_WIN32 */ #endif /* ACE_LACKS_KEY_T */ #if defined (VXWORKS) #if defined (ghs) // GreenHills 1.8.8 needs the stdarg.h #include before the #include of // vxWorks.h. // Also, be sure that these #includes come _after_ the key_t typedef, and // before the #include of time.h. #include /**/ <stdarg.h> #endif /* ghs */ #include /**/ <vxWorks.h> #endif /* VXWORKS */ /////////////////////////////////////////// // // // NOTE: Please do not add any #includes // // before this point. On VxWorks, // // vxWorks.h must be #included // // first! // // // /////////////////////////////////////////// #if defined (ACE_HAS_RENAMED_MAIN) // Rename "main ()" to "ace_main ()". #define main ace_main #endif /* ACE_HAS_RENAMED_MAIN */ #if defined (ACE_HAS_CHARPTR_SPRINTF) #define ACE_SPRINTF_ADAPTER(X) ::strlen (X) #else #define ACE_SPRINTF_ADAPTER(X) X #endif /* ACE_HAS_CHARPTR_SPRINTF */ #if defined (__ACE_INLINE__) #define ACE_INLINE inline #if !defined (ACE_HAS_INLINED_OSCALLS) #define ACE_HAS_INLINED_OSCALLS #endif /* !ACE_HAS_INLINED_OSCALLS */ #else #define ACE_INLINE #endif /* __ACE_INLINE__ */ // Default address for shared memory mapped files and SYSV shared memory // (defaults to 64 M). #if !defined (ACE_DEFAULT_BASE_ADDR) #define ACE_DEFAULT_BASE_ADDR ((char *) (64 * 1024 * 1024)) #endif /* ACE_DEFAULT_BASE_ADDR */ // This fudge factor can be overriden for timers that need it, such as on // Solaris, by defining the ACE_TIMER_SKEW symbol in the appropriate config // header. #if !defined (ACE_TIMER_SKEW) #define ACE_TIMER_SKEW 0 #endif /* ACE_TIMER_SKEW */ // Nasty macro stuff to account for Microsoft Win32 DLL nonsense. We // use these macros so that we don't end up with ACE software // hard-coded to Microsoft proprietary extensions to C++. #if defined (ACE_HAS_DLL) && (ACE_HAS_DLL == 1) #if defined (ACE_BUILD_DLL) #if !defined (_MSC_VER) /* Mark classes as exported, Borland. */ #define ACE_Export _export #else /* Microsoft: */ #define ACE_Export __declspec (dllexport) #endif /* !_MSC_VER */ #else /* Using the DLL. */ #if !defined _MSC_VER #define ACE_Export _import #else #define ACE_Export __declspec (dllimport) #endif /* !_MSC_VER */ #endif /* ACE_BUILD_DLL */ #else /* We're not building a DLL! */ #define ACE_Export #endif /* ACE_HAS_DLL */ #if defined (ACE_HAS_SVC_DLL) && (ACE_HAS_SVC_DLL == 1) #if defined (ACE_BUILD_SVC_DLL) #if !defined (_MSC_VER) /* Mark classes as exported, Borland. */ #define ACE_Svc_Export _export #else /* Microsoft: */ #define ACE_Svc_Export __declspec (dllexport) #endif /* !_MSC_VER */ #else /* Using the DLL. */ #if !defined _MSC_VER #define ACE_Svc_Export _import #else #define ACE_Svc_Export __declspec (dllimport) #endif /* !_MSC_VER */ #endif /* ACE_BUILD_DLL || ACE_BUILD_SVC_DLL */ #else /* We're not building a DLL! */ #define ACE_Svc_Export #endif /* ACE_HAS_SVC_DLL */ // This needs to go here *first* to avoid problems with AIX. // Just to be safe we'll do it with pthreads, too -- jwr #if defined (ACE_HAS_DCETHREADS) || defined (ACE_HAS_PTHREADS) extern "C" { #include /**/ <pthread.h> #if defined (DIGITAL_UNIX) #define pthread_self __pthread_self extern "C" pthread_t pthread_self (void); #endif /* DIGITAL_UNIX */ } #endif /* ACE_HAS_DCETHREADS */ #if (ACE_NTRACE == 1) #define ACE_TRACE(X) #else #define ACE_TRACE(X) ACE_Trace ____ (X, __LINE__, __FILE__) #endif /* ACE_NTRACE */ #include /**/ <time.h> #if defined (ACE_NEEDS_SYSTIME_H) // Some platforms may need to include this, but I suspect that most // will get it from <time.h> #if defined (VXWORKS) #include /**/ <sys/times.h> #else #include /**/ <sys/time.h> #endif /* VXWORKS */ #endif /* ACE_NEEDS_SYSTIME_H */ #if !defined (ACE_HAS_POSIX_TIME) // Definition per POSIX. typedef struct timespec { time_t tv_sec; // Seconds long tv_nsec; // Nanoseconds } timespec_t; #elif defined (ACE_HAS_BROKEN_POSIX_TIME) // OSF/1 defines struct timespec in <sys/timers.h> - Tom Marrs #include /**/ <sys/timers.h> #endif /* !ACE_HAS_POSIX_TIME */ #if !defined (ACE_HAS_CLOCK_GETTIME) && !defined (_CLOCKID_T) typedef int clockid_t; #if !defined (CLOCK_REALTIME) #define CLOCK_REALTIME 0 #endif /* CLOCK_REALTIME */ #endif /* ! ACE_HAS_CLOCK_GETTIME && ! _CLOCKID_T */ // #if (!defined (timespec) && !defined (m88k)) // #define timestruc_t struct timespec // #endif /* timespec */ #if !defined (ACE_HAS_SVR4_TIME) // Definition per SVr4. typedef struct timespec timestruc_t; #endif /* ACE_HAS_SVR4_TIME */ class ACE_Export ACE_Time_Value // = TITLE // Operations on "timeval" structures. // // = DESCRIPTION // This class centralizes all the time-related processing in // ACE. These timers are typically used in conjunction with // lower-level OS mechanisms like <select>, <poll>, or // <cond_timedwait>. ACE_Time_Value help make the use of these // mechanisms portable across OS platforms, { public: // = Useful constants. static const ACE_Time_Value zero; // Constant "0". // = Initialization methods. ACE_Time_Value (void); // Default Constructor. ACE_Time_Value (long sec, long usec = 0); // Constructor. // = Methods for converting to/from various time formats. ACE_Time_Value (const struct timeval &t); // Construct the <ACE_Time_Value> from a <timeval>. ACE_Time_Value (const timestruc_t &t); // Initializes the <ACE_Time_Value> object from a <timestruc_t>. ACE_Time_Value (const ACE_Time_Value &tv); // Copy constructor. #if defined (ACE_WIN32) ACE_Time_Value (const FILETIME &ft); // Initializes the ACE_Time_Value object from a Win32 FILETIME #endif /* ACE_WIN32 */ void set (long sec, long usec); // Construct a <Time_Value> from two <long>s. void set (double d); // Construct a <Time_Value> from a <double>, which is assumed to be // in second format, with any remainder treated as microseconds. void set (const timeval &t); // Construct a <Time_Value> from a <timeval>. void set (const timestruc_t &t); // Initializes the <Time_Value> object from a <timestruc_t>. #if defined (ACE_WIN32) void set (const FILETIME &ft); // Initializes the <Time_Value> object from a <timestruc_t>. #endif /* ACE_WIN32 */ long msec (void) const; // Converts from <Time_Value> format into milli-seconds format. void msec (long); // Converts from milli-seconds format into <Time_Value> format. operator timestruc_t () const; // Returns the value of the object as a <timestruc_t>. operator timeval () const; // Returns the value of the object as a <timeval>. operator timeval *() const; // Returns a pointer to the object as a <timeval>. #if defined (ACE_WIN32) operator FILETIME () const; // Returns the value of the object as a Win32 FILETIME. #endif /* ACE_WIN32 */ // = The following are accessor/mutator methods. long sec (void) const; // Get seconds. void sec (long sec); // Set seconds. long usec (void) const; // Get microseconds. void usec (long usec); // Set microseconds. // = The following are arithmetic methods for operating on // Time_Values. void operator += (const ACE_Time_Value &tv); // Add <tv> to this. void operator -= (const ACE_Time_Value &tv); // Subtract <tv> to this. friend ACE_Export ACE_Time_Value operator + (const ACE_Time_Value &tv1, const ACE_Time_Value &tv2); // Adds two ACE_Time_Value objects together, returns the sum. friend ACE_Export ACE_Time_Value operator - (const ACE_Time_Value &tv1, const ACE_Time_Value &tv2); // Subtracts two ACE_Time_Value objects, returns the difference. friend ACE_Export int operator < (const ACE_Time_Value &tv1, const ACE_Time_Value &tv2); // True if tv1 < tv2. friend ACE_Export int operator > (const ACE_Time_Value &tv1, const ACE_Time_Value &tv2); // True if tv1 > tv2. friend ACE_Export int operator <= (const ACE_Time_Value &tv1, const ACE_Time_Value &tv2); // True if tv1 <= tv2. friend ACE_Export int operator >= (const ACE_Time_Value &tv1, const ACE_Time_Value &tv2); // True if tv1 >= tv2. friend ACE_Export int operator == (const ACE_Time_Value &tv1, const ACE_Time_Value &tv2); // True if tv1 == tv2. friend ACE_Export int operator != (const ACE_Time_Value &tv1, const ACE_Time_Value &tv2); // True if tv1 != tv2. void dump (void) const; // Dump the state of an object. private: void normalize (void); // Put the timevalue into a canonical form. timeval tv_; // Store the values as a <timeval>. }; class ACE_Export ACE_Countdown_Time // = TITLE // Keeps track of the amount of elapsed time. // // = DESCRIPTION // This class has a side-effect on the <max_wait_time> -- every // time the <stop> method is called the <max_wait_time> is // updated. { public: // = Initialization and termination methods. ACE_Countdown_Time (ACE_Time_Value *max_wait_time); // Cache the <max_wait_time> and call <start>. ~ACE_Countdown_Time (void); // Call <stop>. int start (void); // Cache the current time and enter a start state. int stop (void); // Subtract the elapsed time from max_wait_time_ and enter a stopped // state. int update (void); // Calls stop and then start. max_wait_time_ is modified by the // call to stop. private: ACE_Time_Value *max_wait_time_; // Maximum time we were willing to wait. ACE_Time_Value start_time_; // Beginning of the start time. int stopped_; // Keeps track of whether we've already been stopped. }; #if defined (ACE_HAS_USING_KEYWORD) #define ACE_USING using #else #define ACE_USING #endif /* ACE_HAS_USING_KEYWORD */ #if defined (ACE_HAS_TYPENAME_KEYWORD) #define ACE_TYPENAME typename #else #define ACE_TYPENAME #endif /* ACE_HAS_TYPENAME_KEYWORD */ // The following is necessary since many C++ compilers don't support // typedef'd types inside of classes used as formal template // arguments... ;-(. Luckily, using the C++ preprocessor I can hide // most of this nastiness! #if defined (ACE_HAS_TEMPLATE_TYPEDEFS) // Handle ACE_Message_Queue. #define ACE_SYNCH_1 class _ACE_SYNCH #define ACE_SYNCH_2 _ACE_SYNCH #define ACE_SYNCH_MUTEX_T ACE_TYPENAME _ACE_SYNCH::MUTEX #define ACE_SYNCH_CONDITION_T ACE_TYPENAME _ACE_SYNCH::CONDITION #define ACE_SYNCH_SEMAPHORE_T ACE_TYPENAME _ACE_SYNCH::SEMAPHORE // Handle ACE_Malloc* #define ACE_MEM_POOL_1 class _ACE_MEM_POOL #define ACE_MEM_POOL_2 _ACE_MEM_POOL #define ACE_MEM_POOL _ACE_MEM_POOL #define ACE_MEM_POOL_OPTIONS ACE_TYPENAME _ACE_MEM_POOL::OPTIONS // Handle ACE_Svc_Handler #define ACE_PEER_STREAM_1 class _ACE_PEER_STREAM #define ACE_PEER_STREAM_2 _ACE_PEER_STREAM #define ACE_PEER_STREAM _ACE_PEER_STREAM #define ACE_PEER_STREAM_ADDR ACE_TYPENAME _ACE_PEER_STREAM::PEER_ADDR // Handle ACE_Acceptor #define ACE_PEER_ACCEPTOR_1 class _ACE_PEER_ACCEPTOR #define ACE_PEER_ACCEPTOR_2 _ACE_PEER_ACCEPTOR #define ACE_PEER_ACCEPTOR _ACE_PEER_ACCEPTOR #define ACE_PEER_ACCEPTOR_ADDR ACE_TYPENAME _ACE_PEER_ACCEPTOR::PEER_ADDR // Handle ACE_Connector #define ACE_PEER_CONNECTOR_1 class _ACE_PEER_CONNECTOR #define ACE_PEER_CONNECTOR_2 _ACE_PEER_CONNECTOR #define ACE_PEER_CONNECTOR _ACE_PEER_CONNECTOR #define ACE_PEER_CONNECTOR_ADDR ACE_TYPENAME _ACE_PEER_CONNECTOR::PEER_ADDR #if !defined(ACE_HAS_TYPENAME_KEYWORD) #define ACE_PEER_CONNECTOR_ADDR_ANY ACE_PEER_CONNECTOR_ADDR::sap_any #else // // If the compiler supports 'typename' we cannot use // // PEER_CONNECTOR::PEER_ADDR::sap_any // // because PEER_CONNECTOR::PEER_ADDR is not considered a type. But: // // typename PEER_CONNECTOR::PEER_ADDR::sap_any // // will not work either, because now we are declaring sap_any a // type, further: // // (typename PEER_CONNECTOR::PEER_ADDR)::sap_any // // is considered a casting expression. All I can think of is using a // typedef, I tried PEER_ADDR but that was a source of trouble on // some platforms. I will try: // #define ACE_PEER_CONNECTOR_ADDR_ANY ACE_PEER_ADDR_TYPEDEF::sap_any #endif /* ACE_HAS_TYPENAME_KEYWORD */ // Handle ACE_SOCK_* #define ACE_SOCK_ACCEPTOR ACE_SOCK_Acceptor #define ACE_SOCK_CONNECTOR ACE_SOCK_Connector #define ACE_SOCK_STREAM ACE_SOCK_Stream // Handle ACE_LSOCK_* #define ACE_LSOCK_ACCEPTOR ACE_LSOCK_Acceptor #define ACE_LSOCK_CONNECTOR ACE_LSOCK_Connector #define ACE_LSOCK_STREAM ACE_LSOCK_Stream // Handle ACE_TLI_* #define ACE_TLI_ACCEPTOR ACE_TLI_Acceptor #define ACE_TLI_CONNECTOR ACE_TLI_Connector #define ACE_TLI_STREAM ACE_TLI_Stream // Handle ACE_SPIPE_* #define ACE_SPIPE_ACCEPTOR ACE_SPIPE_Acceptor #define ACE_SPIPE_CONNECTOR ACE_SPIPE_Connector #define ACE_SPIPE_STREAM ACE_SPIPE_Stream // Handle ACE_UPIPE_* #define ACE_UPIPE_ACCEPTOR ACE_UPIPE_Acceptor #define ACE_UPIPE_CONNECTOR ACE_UPIPE_Connector #define ACE_UPIPE_STREAM ACE_UPIPE_Stream // Handle ACE_*_Memory_Pool. #define ACE_MMAP_MEMORY_POOL ACE_MMAP_Memory_Pool #define ACE_LITE_MMAP_MEMORY_POOL ACE_Lite_MMAP_Memory_Pool #define ACE_SBRK_MEMORY_POOL ACE_Sbrk_Memory_Pool #define ACE_SHARED_MEMORY_POOL ACE_Shared_Memory_Pool #define ACE_LOCAL_MEMORY_POOL ACE_Local_Memory_Pool #else /* TEMPLATES are broken in some form or another (i.e., most C++ compilers) */ // Handle ACE_Message_Queue. #if defined (ACE_HAS_OPTIMIZED_MESSAGE_QUEUE) #define ACE_SYNCH_1 class _ACE_SYNCH_MUTEX_T, class _ACE_SYNCH_SEMAPHORE_T #define ACE_SYNCH_2 _ACE_SYNCH_MUTEX_T, _ACE_SYNCH_SEMAPHORE_T #else #define ACE_SYNCH_1 class _ACE_SYNCH_MUTEX_T, class _ACE_SYNCH_CONDITION_T #define ACE_SYNCH_2 _ACE_SYNCH_MUTEX_T, _ACE_SYNCH_CONDITION_T #endif /* ACE_HAS_OPTIMIZED_MESSAGE_QUEUE */ #define ACE_SYNCH_MUTEX_T _ACE_SYNCH_MUTEX_T #define ACE_SYNCH_CONDITION_T _ACE_SYNCH_CONDITION_T #define ACE_SYNCH_SEMAPHORE_T _ACE_SYNCH_SEMAPHORE_T // Handle ACE_Malloc* #define ACE_MEM_POOL_1 class _ACE_MEM_POOL, class _ACE_MEM_POOL_OPTIONS #define ACE_MEM_POOL_2 _ACE_MEM_POOL, _ACE_MEM_POOL_OPTIONS #define ACE_MEM_POOL _ACE_MEM_POOL #define ACE_MEM_POOL_OPTIONS _ACE_MEM_POOL_OPTIONS // Handle ACE_Svc_Handler #define ACE_PEER_STREAM_1 class _ACE_PEER_STREAM, class _ACE_PEER_ADDR #define ACE_PEER_STREAM_2 _ACE_PEER_STREAM, _ACE_PEER_ADDR #define ACE_PEER_STREAM _ACE_PEER_STREAM #define ACE_PEER_STREAM_ADDR _ACE_PEER_ADDR // Handle ACE_Acceptor #define ACE_PEER_ACCEPTOR_1 class _ACE_PEER_ACCEPTOR, class _ACE_PEER_ADDR #define ACE_PEER_ACCEPTOR_2 _ACE_PEER_ACCEPTOR, _ACE_PEER_ADDR #define ACE_PEER_ACCEPTOR _ACE_PEER_ACCEPTOR #define ACE_PEER_ACCEPTOR_ADDR _ACE_PEER_ADDR // Handle ACE_Connector #define ACE_PEER_CONNECTOR_1 class _ACE_PEER_CONNECTOR, class _ACE_PEER_ADDR #define ACE_PEER_CONNECTOR_2 _ACE_PEER_CONNECTOR, _ACE_PEER_ADDR #define ACE_PEER_CONNECTOR _ACE_PEER_CONNECTOR #define ACE_PEER_CONNECTOR_ADDR _ACE_PEER_ADDR #define ACE_PEER_CONNECTOR_ADDR_ANY ACE_PEER_CONNECTOR_ADDR::sap_any // Handle ACE_SOCK_* #define ACE_SOCK_ACCEPTOR ACE_SOCK_Acceptor, ACE_INET_Addr #define ACE_SOCK_CONNECTOR ACE_SOCK_Connector, ACE_INET_Addr #define ACE_SOCK_STREAM ACE_SOCK_Stream, ACE_INET_Addr // Handle ACE_LSOCK_* #define ACE_LSOCK_ACCEPTOR ACE_LSOCK_Acceptor, ACE_UNIX_Addr #define ACE_LSOCK_CONNECTOR ACE_LSOCK_Connector, ACE_UNIX_Addr #define ACE_LSOCK_STREAM ACE_LSOCK_Stream, ACE_UNIX_Addr // Handle ACE_TLI_* #define ACE_TLI_ACCEPTOR ACE_TLI_Acceptor, ACE_INET_Addr #define ACE_TLI_CONNECTOR ACE_TLI_Connector, ACE_INET_Addr #define ACE_TLI_STREAM ACE_TLI_Stream, ACE_INET_Addr // Handle ACE_SPIPE_* #define ACE_SPIPE_ACCEPTOR ACE_SPIPE_Acceptor, ACE_SPIPE_Addr #define ACE_SPIPE_CONNECTOR ACE_SPIPE_Connector, ACE_SPIPE_Addr #define ACE_SPIPE_STREAM ACE_SPIPE_Stream, ACE_SPIPE_Addr // Handle ACE_UPIPE_* #define ACE_UPIPE_ACCEPTOR ACE_UPIPE_Acceptor, ACE_SPIPE_Addr #define ACE_UPIPE_CONNECTOR ACE_UPIPE_Connector, ACE_SPIPE_Addr #define ACE_UPIPE_STREAM ACE_UPIPE_Stream, ACE_SPIPE_Addr // Handle ACE_*_Memory_Pool. #define ACE_MMAP_MEMORY_POOL ACE_MMAP_Memory_Pool, ACE_MMAP_Memory_Pool_Options #define ACE_LITE_MMAP_MEMORY_POOL ACE_Lite_MMAP_Memory_Pool, ACE_MMAP_Memory_Pool_Options #define ACE_SBRK_MEMORY_POOL ACE_Sbrk_Memory_Pool, ACE_Sbrk_Memory_Pool_Options #define ACE_SHARED_MEMORY_POOL ACE_Shared_Memory_Pool, ACE_Shared_Memory_Pool_Options #define ACE_LOCAL_MEMORY_POOL ACE_Local_Memory_Pool, ACE_Local_Memory_Pool_Options #endif /* ACE_HAS_TEMPLATE_TYPEDEFS */ // For Win32 compatibility... #if !defined (ACE_WSOCK_VERSION) #define ACE_WSOCK_VERSION 0, 0 #endif /* ACE_WSOCK_VERSION */ #if defined (ACE_HAS_BROKEN_CTIME) #undef ctime #endif /* ACE_HAS_BROKEN_CTIME */ // Static service macros #define ACE_STATIC_SVC_DECLARE(X) extern ACE_Static_Svc_Descriptor ace_svc_desc_##X ; #define ACE_STATIC_SVC_DEFINE(X, NAME, TYPE, FN, FLAGS, ACTIVE) \ ACE_Static_Svc_Descriptor ace_svc_desc_##X = { NAME, TYPE, FN, FLAGS, ACTIVE }; #define ACE_STATIC_SVC_REQUIRE(X)\ class ACE_Static_Svc_##X {\ public:\ ACE_Static_Svc_##X() { ACE_Service_Config::static_svcs ()->insert (&ace_svc_desc_##X); }\ };\ static ACE_Static_Svc_##X ace_static_svc_##X; // Dynamic/static service macros. #define ACE_SVC_FACTORY_DECLARE(X) extern "C" ACE_Svc_Export ACE_Service_Object *_make_##X (void); #define ACE_SVC_INVOKE(X) _make_##X () #define ACE_SVC_NAME(X) _make_##X #define ACE_SVC_FACTORY_DEFINE(X) extern "C" ACE_Service_Object *_make_##X () { ACE_TRACE (#X); return new X; } #if !(defined (ACE_HAS_THREADS) && defined (ACE_HAS_THREAD_SPECIFIC_STORAGE)) #define ACE_TSS_TYPE(T) T #define ACE_TSS_GET(I, T) (I) #else #define ACE_TSS_TYPE(T) ACE_TSS< T > #if defined (ACE_HAS_BROKEN_CONVERSIONS) #define ACE_TSS_GET(I, T) (*(I)) #else #define ACE_TSS_GET(I, T) ((I)->operator T * ()) #endif /* ACE_HAS_BROKEN_CONVERSIONS */ #endif /* !(defined (ACE_HAS_THREADS) && defined (ACE_HAS_THREAD_SPECIFIC_STORAGE)) */ #if defined (ACE_LACKS_MODE_MASKS) // MODE MASKS // the following macros are for POSIX conformance. #define S_IRWXU 00700 /* read, write, execute: owner. */ #define S_IRUSR 00400 /* read permission: owner. */ #define S_IWUSR 00200 /* write permission: owner. */ #define S_IXUSR 00100 /* execute permission: owner. */ #define S_IRWXG 00070 /* read, write, execute: group. */ #define S_IRGRP 00040 /* read permission: group. */ #define S_IWGRP 00020 /* write permission: group. */ #define S_IXGRP 00010 /* execute permission: group. */ #define S_IRWXO 00007 /* read, write, execute: other. */ #define S_IROTH 00004 /* read permission: other. */ #define S_IWOTH 00002 /* write permission: other. */ #define S_IXOTH 00001 /* execute permission: other. */ #endif /* ACE_LACKS_MODE_MASKS */ #if defined (ACE_LACKS_SEMBUF_T) struct sembuf { u_short sem_num; // semaphore # short sem_op; // semaphore operation short sem_flg; // operation flags }; #endif /* ACE_LACKS_SEMBUF_T */ #if defined (ACE_HAS_H_ERRNO) void herror (const char *str); #endif /* ACE_HAS_H_ERRNO */ #if defined (ACE_LACKS_MSGBUF_T) struct msgbuf {}; #endif /* ACE_LACKS_MSGBUF_T */ #if defined (ACE_LACKS_STRRECVFD) struct strrecvfd {}; #endif /* ACE_LACKS_STRRECVFD */ #if defined (ACE_HAS_PROC_FS) #include /**/ <sys/procfs.h> #endif /* ACE_HAS_PROC_FD */ #if defined (ACE_HAS_UNICODE) #include /**/ <wchar.h> #endif /* ACE_HAS_UNICODE */ #if defined (ACE_HAS_BROKEN_WRITEV) typedef struct iovec ACE_WRITEV_TYPE; #else typedef const struct iovec ACE_WRITEV_TYPE; #endif /* ACE_HAS_BROKEN_WRITEV */ #if defined (ACE_HAS_BROKEN_READV) typedef const struct iovec ACE_READV_TYPE; #else typedef struct iovec ACE_READV_TYPE; #endif /* ACE_HAS_BROKEN_WRITEV */ #if defined (ACE_HAS_BROKEN_SETRLIMIT) typedef struct rlimit ACE_SETRLIMIT_TYPE; #else typedef const struct rlimit ACE_SETRLIMIT_TYPE; #endif /* ACE_HAS_BROKEN_SETRLIMIT */ #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0) #define ACE_MT(X) X #if !defined (_REENTRANT) #define _REENTRANT #endif /* _REENTRANT */ #else #define ACE_MT(X) #endif /* ACE_MT_SAFE */ // These are the various states a thread managed by the // <Thread_Manager> can be in. enum ACE_Thread_State { ACE_THR_IDLE, // Uninitialized. ACE_THR_SPAWNED, // Created but not yet running. ACE_THR_RUNNING, // Thread is active (naturally, we don't know if it's actually // *running* because we aren't the scheduler...). ACE_THR_SUSPENDED, // Thread is suspended. ACE_THR_CANCELLED, // Thread has been cancelled (which is an indiction that it needs to // terminate...). ACE_THR_TERMINATED // Thread has shutdown, but the slot in the thread manager hasn't // been reclaimed yet. }; #if !defined (ACE_DEFAULT_THREAD_PRIORITY) #define ACE_DEFAULT_THREAD_PRIORITY (-0x7fffffffL - 1L) #endif /* ACE_DEFAULT_THREAD_PRIORITY */ // Convenient macro for testing for deadlock, as well as for detecting // when mutexes fail. #define ACE_GUARD_RETURN(MUTEX,OBJ,LOCK,RETURN) \ ACE_Guard<MUTEX> OBJ (LOCK); \ if (OBJ.locked () == 0) return RETURN; #define ACE_WRITE_GUARD_RETURN(MUTEX,OBJ,LOCK,RETURN) \ ACE_Write_Guard<MUTEX> OBJ (LOCK); \ if (OBJ.locked () == 0) return RETURN; #define ACE_READ_GUARD_RETURN(MUTEX,OBJ,LOCK,RETURN) \ ACE_Read_Guard<MUTEX> OBJ (LOCK); \ if (OBJ.locked () == 0) return RETURN; #define ACE_GUARD(MUTEX,OBJ,LOCK) \ ACE_Guard<MUTEX> OBJ (LOCK); \ if (OBJ.locked () == 0) return; #if defined (ACE_HAS_POSIX_SEM) #include /**/ <semaphore.h> typedef struct { sem_t *sema_; // Pointer to semaphore handle. This is allocated by ACE if we are // working with an unnamed POSIX semaphore or by the OS if we are // working with a named POSIX semaphore. char *name_; // Name of the semaphore (if this is non-NULL then this is a named // POSIX semaphore, else its an unnamed POSIX semaphore). } ACE_sema_t; #endif /* ACE_HAS_POSIX_SEM */ struct cancel_state { int cancelstate; // e.g., PTHREAD_CANCEL_ENABLE, PTHREAD_CANCEL_DISABLE, // PTHREAD_CANCELED. int canceltype; // e.g., PTHREAD_CANCEL_DEFERRED and PTHREAD_CANCEL_ASYNCHRONOUS. }; #if defined (ACE_HAS_THREADS) # if defined (ACE_HAS_STHREADS) # include /**/ <synch.h> # include /**/ <thread.h> # define ACE_SCOPE_PROCESS P_PID # define ACE_SCOPE_LWP P_LWPID # define ACE_SCOPE_THREAD (ACE_SCOPE_LWP + 1) # else # define ACE_SCOPE_PROCESS 0 # define ACE_SCOPE_LWP 1 # define ACE_SCOPE_THREAD 2 # endif /* ACE_HAS_STHREADS */ # if ! (defined (ACE_HAS_DCETHREADS) || defined (ACE_HAS_PTHREADS)) # define ACE_SCHED_OTHER 0 # define ACE_SCHED_FIFO 1 # define ACE_SCHED_RR 2 # endif /* ! (ACE_HAS_DCETHREADS || ACE_HAS_PTHREADS) */ # if defined (ACE_HAS_DCETHREADS) || defined (ACE_HAS_PTHREADS) # define ACE_SCHED_OTHER SCHED_OTHER # define ACE_SCHED_FIFO SCHED_FIFO # define ACE_SCHED_RR SCHED_RR // Definitions for mapping POSIX pthreads onto Solaris threads. # if defined (ACE_HAS_FSU_PTHREADS) # define PTHREAD_DETACHED 0x1 # define PTHREAD_SCOPE_SYSTEM 0x2 # define PTHREAD_INHERIT_SCHED 0x4 # define PTHREAD_NOFLOAT 0x8 # define PTHREAD_CREATE_UNDETACHED 0 # define PTHREAD_CREATE_DETACHED PTHREAD_DETACHED # define PTHREAD_CREATE_JOINABLE 0 # define PTHREAD_SCOPE_PROCESS 0 # define PTHREAD_EXPLICIT_SCHED 0 # define PTHREAD_MIN_PRIORITY 0 # define PTHREAD_MAX_PRIORITY 126 # endif /* ACE_HAS_FSU_PTHREADS */ # if defined (ACE_HAS_SETKIND_NP) # define PRIORITY_MAX PTHREAD_MAX_PRIORITY # endif /* ACE_HAS_SETKIND_NP */ // Definitions for THREAD- and PROCESS-LEVEL priorities...some // implementations define these while others don't. In order to // further complicate matters, we don't redefine the default (*_DEF) // values if they've already been defined, which allows individual // programs to have their own ACE-wide "default". // PROCESS-level values # define ACE_PROC_PRI_FIFO_MIN (sched_get_priority_min(SCHED_FIFO)) # define ACE_PROC_PRI_FIFO_MAX (sched_get_priority_max(SCHED_FIFO)) # define ACE_PROC_PRI_RR_MIN (sched_get_priority_min(SCHED_RR)) # define ACE_PROC_PRI_RR_MAX (sched_get_priority_max(SCHED_RR)) # define ACE_PROC_PRI_OTHER_MIN (sched_get_priority_min(SCHED_OTHER)) # define ACE_PROC_PRI_OTHER_MAX (sched_get_priority_max(SCHED_OTHER)) # if !defined(ACE_PROC_PRI_FIFO_DEF) # define ACE_PROC_PRI_FIFO_DEF (ACE_PROC_PRI_FIFO_MIN + (ACE_PROC_PRI_FIFO_MAX - ACE_PROC_PRI_FIFO_MIN)/2) # endif # if !defined(ACE_PROC_PRI_RR_DEF) # define ACE_PROC_PRI_RR_DEF (ACE_PROC_PRI_RR_MIN + (ACE_PROC_PRI_RR_MAX - ACE_PROC_PRI_RR_MIN)/2) # endif # if !defined(ACE_PROC_PRI_OTHER_DEF) # define ACE_PROC_PRI_OTHER_DEF (ACE_PROC_PRI_OTHER_MIN + (ACE_PROC_PRI_OTHER_MAX - ACE_PROC_PRI_OTHER_MIN)/2) # endif // THREAD-level values # if defined(PRI_FIFO_MIN) && defined(PRI_FIFO_MAX) && defined(PRI_RR_MIN) && defined(PRI_RR_MAX) && defined(PRI_OTHER_MIN) && defined(PRI_OTHER_MAX) # define ACE_THR_PRI_FIFO_MIN PRI_FIFO_MIN # define ACE_THR_PRI_FIFO_MAX PRI_FIFO_MAX # define ACE_THR_PRI_RR_MIN PRI_RR_MIN # define ACE_THR_PRI_RR_MAX PRI_RR_MAX # define ACE_THR_PRI_OTHER_MIN PRI_OTHER_MIN # define ACE_THR_PRI_OTHER_MAX PRI_OTHER_MAX # else # define ACE_THR_PRI_FIFO_MIN ACE_PROC_PRI_FIFO_MIN # define ACE_THR_PRI_FIFO_MAX ACE_PROC_PRI_FIFO_MAX # define ACE_THR_PRI_RR_MIN ACE_PROC_PRI_RR_MIN # define ACE_THR_PRI_RR_MAX ACE_PROC_PRI_RR_MAX # define ACE_THR_PRI_OTHER_MIN ACE_PROC_PRI_OTHER_MIN # define ACE_THR_PRI_OTHER_MAX ACE_PROC_PRI_OTHER_MAX # endif # if !defined(ACE_THR_PRI_FIFO_DEF) # define ACE_THR_PRI_FIFO_DEF (ACE_THR_PRI_FIFO_MIN + (ACE_THR_PRI_FIFO_MAX - ACE_THR_PRI_FIFO_MIN)/2) # endif # if !defined(ACE_THR_PRI_RR_DEF) # define ACE_THR_PRI_RR_DEF (ACE_THR_PRI_RR_MIN + (ACE_THR_PRI_RR_MAX - ACE_THR_PRI_RR_MIN)/2) # endif # if !defined(ACE_THR_PRI_OTHER_DEF) # define ACE_THR_PRI_OTHER_DEF (ACE_THR_PRI_OTHER_MIN + (ACE_THR_PRI_OTHER_MAX - ACE_THR_PRI_OTHER_MIN)/2) # endif # if !defined (ACE_HAS_TID_T) typedef pthread_t tid_t; # endif /* ACE_HAS_TID_T */ // Typedefs to help compatibility with Windows NT and Pthreads. # if defined (ACE_HAS_PTHREAD_T) typedef pthread_t ACE_hthread_t; # else /* ACE_HAS_PTHREAD_T */ typedef tid_t ACE_hthread_t; # endif /* ACE_HAS_PTHREAD_T */ // Make it easier to write portable thread code. typedef pthread_t ACE_thread_t; typedef pthread_key_t ACE_thread_key_t; typedef pthread_mutex_t ACE_mutex_t; typedef pthread_cond_t ACE_cond_t; typedef pthread_mutex_t ACE_thread_mutex_t; # if !defined (PTHREAD_CANCEL_DISABLE) # define PTHREAD_CANCEL_DISABLE 0 # endif /* PTHREAD_CANCEL_DISABLE */ # if !defined (PTHREAD_CANCEL_ENABLE) # define PTHREAD_CANCEL_ENABLE 0 # endif /* PTHREAD_CANCEL_ENABLE */ # if !defined (PTHREAD_CANCEL_DEFERRED) # define PTHREAD_CANCEL_DEFERRED 0 # endif /* PTHREAD_CANCEL_DEFERRED */ # if !defined (PTHREAD_CANCEL_ASYNCHRONOUS) # define PTHREAD_CANCEL_ASYNCHRONOUS 0 # endif /* PTHREAD_CANCEL_ASYNCHRONOUS */ # define THR_CANCEL_DISABLE PTHREAD_CANCEL_DISABLE # define THR_CANCEL_ENABLE PTHREAD_CANCEL_ENABLE # define THR_CANCEL_DEFERRED PTHREAD_CANCEL_DEFERRED # define THR_CANCEL_ASYNCHRONOUS PTHREAD_CANCEL_ASYNCHRONOUS # if !defined (PTHREAD_CREATE_JOINABLE) # if defined (PTHREAD_CREATE_UNDETACHED) # define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED # else # define PTHREAD_CREATE_JOINABLE 0 # endif /* PTHREAD_CREATE_UNDETACHED */ # endif /* PTHREAD_CREATE_JOINABLE */ # if !defined (PTHREAD_CREATE_DETACHED) # define PTHREAD_CREATE_DETACHED 1 # endif /* PTHREAD_CREATE_DETACHED */ # if !defined (PTHREAD_PROCESS_PRIVATE) # if defined (PTHREAD_MUTEXTYPE_FAST) # define PTHREAD_PROCESS_PRIVATE PTHREAD_MUTEXTYPE_FAST # else # define PTHREAD_PROCESS_PRIVATE 0 # endif /* PTHREAD_MUTEXTYPE_FAST */ # endif /* PTHREAD_PROCESS_PRIVATE */ # if !defined (PTHREAD_PROCESS_SHARED) # if defined (PTHREAD_MUTEXTYPE_FAST) # define PTHREAD_PROCESS_SHARED PTHREAD_MUTEXTYPE_FAST # else # define PTHREAD_PROCESS_SHARED 0 # endif /* PTHREAD_MUTEXTYPE_FAST */ # endif /* PTHREAD_PROCESS_SHARED */ # if defined (ACE_HAS_DCETHREADS) # if defined (PTHREAD_PROCESS_PRIVATE) # define USYNC_THREAD PTHREAD_PROCESS_PRIVATE # else # define USYNC_THREAD MUTEX_NONRECURSIVE_NP # endif /* PTHREAD_PROCESS_PRIVATE */ # if defined (PTHREAD_PROCESS_SHARED) # define USYNC_PROCESS PTHREAD_PROCESS_SHARED # else # define USYNC_PROCESS MUTEX_NONRECURSIVE_NP # endif /* PTHREAD_PROCESS_SHARED */ # elif !defined (ACE_HAS_STHREADS) # define USYNC_THREAD PTHREAD_PROCESS_PRIVATE # define USYNC_PROCESS PTHREAD_PROCESS_SHARED # endif /* ACE_HAS_DCETHREADS */ # define THR_BOUND 0x00000001 # if defined (CHORUS) # define THR_NEW_LWP 0x00000000 # else # define THR_NEW_LWP 0x00000002 # endif /* CHORUS */ # define THR_DETACHED 0x00000040 # define THR_SUSPENDED 0x00000080 # define THR_DAEMON 0x00000100 # define THR_JOINABLE 0x00010000 # define THR_SCHED_FIFO 0x00020000 # define THR_SCHED_RR 0x00040000 # define THR_SCHED_DEFAULT 0x00080000 # if defined (ACE_HAS_IRIX62_THREADS) # define THR_SCOPE_SYSTEM 0x00100000 # else # define THR_SCOPE_SYSTEM THR_BOUND # endif /* ACE_HAS_IRIX62_THREADS */ # define THR_SCOPE_PROCESS 0x00200000 # define THR_INHERIT_SCHED 0x00400000 # define THR_EXPLICIT_SCHED 0x00800000 # define THR_SCHED_IO 0x01000000 # if !defined (ACE_HAS_STHREADS) # if !defined (ACE_HAS_POSIX_SEM) // This is used to implement semaphores for POSIX pthreads, but // without POSIX semaphores. It is different than the POSIX sem_t. class ACE_Export ACE_sema_t { friend class ACE_OS; protected: ACE_mutex_t lock_; // Serialize access to internal state. ACE_cond_t count_nonzero_; // Block until there are no waiters. u_long count_; // Count of the semaphore. u_long waiters_; // Number of threads that have called <ACE_OS::sema_wait>. }; # endif /* !ACE_HAS_POSIX_SEM */ #if defined (ACE_LACKS_PTHREAD_YIELD) && defined (ACE_HAS_THR_YIELD) #if defined (USYNC_THREAD) #undef USYNC_THREAD #endif /* USYNC_THREAD */ #if defined (USYNC_PROCESS) #undef USYNC_PROCESS #endif /* USYNC_PROCESS */ # include /**/ <thread.h> #endif /* defined (ACE_LACKS_PTHREAD_YIELD) && defined (ACE_HAS_THR_YIELD) */ # else // If we are on Solaris we can just reuse the existing implementations // of these synchronization types. typedef rwlock_t ACE_rwlock_t; # if !defined (ACE_HAS_POSIX_SEM) typedef sema_t ACE_sema_t; # endif /* !ACE_HAS_POSIX_SEM */ # endif /* !ACE_HAS_STHREADS */ #elif defined (ACE_HAS_STHREADS) // Typedefs to help compatibility with Windows NT and Pthreads. typedef thread_t ACE_thread_t; typedef thread_key_t ACE_thread_key_t; typedef mutex_t ACE_mutex_t; typedef rwlock_t ACE_rwlock_t; # if !defined (ACE_HAS_POSIX_SEM) typedef sema_t ACE_sema_t; # endif /* !ACE_HAS_POSIX_SEM */ typedef cond_t ACE_cond_t; typedef ACE_thread_t ACE_hthread_t; typedef ACE_mutex_t ACE_thread_mutex_t; # define THR_CANCEL_DISABLE 0 # define THR_CANCEL_ENABLE 0 # define THR_CANCEL_DEFERRED 0 # define THR_CANCEL_ASYNCHRONOUS 0 #elif defined (VXWORKS) // For mutex implementation using mutual-exclusion semaphores (which // can be taken recursively). # include /**/ <semLib.h> # include /**/ <hostLib.h> # include /**/ <ioLib.h> # include /**/ <remLib.h> # include /**/ <selectLib.h> # include /**/ <sigLib.h> # include /**/ <sockLib.h> # include /**/ <sysLib.h> # include /**/ <taskLib.h> # include /**/ <taskHookLib.h> extern "C" struct sockaddr_un { short sun_family; // AF_UNIX. char sun_path[108]; // path name. }; #define MAXPATHLEN 1024 #define MAXNAMLEN 255 #define NSIG _NSIGS // task options: the other options are either obsolete, internal, or for // Fortran or Ada support # define VX_UNBREAKABLE 0x0002 /* breakpoints ignored */ # define VX_FP_TASK 0x0008 /* floating point coprocessor */ # define VX_PRIVATE_ENV 0x0080 /* private environment support */ # define VX_NO_STACK_FILL 0x0100 /* do not stack fill for checkstack () */ # define THR_CANCEL_DISABLE 0 # define THR_CANCEL_ENABLE 0 # define THR_CANCEL_DEFERRED 0 # define THR_CANCEL_ASYNCHRONOUS 0 # 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 0 # define USYNC_PROCESS 1 /* it's all global on VxWorks (without MMU option) */ typedef SEM_ID ACE_mutex_t; // implement ACE_thread_mutex_t with ACE_mutex_t sinces there's just one process . . . typedef ACE_mutex_t ACE_thread_mutex_t; # if !defined (ACE_HAS_POSIX_SEM) // Use VxWorks semaphores, wrapped . . . typedef struct { SEM_ID sema_; // Semaphore handle. This is allocated by VxWorks. char *name_; // Name of the semaphore: always NULL with VxWorks. } ACE_sema_t; # endif /* !ACE_HAS_POSIX_SEM */ typedef char * ACE_thread_t; typedef int ACE_hthread_t; typedef int ACE_thread_key_t; #elif defined (ACE_HAS_WTHREADS) typedef CRITICAL_SECTION ACE_thread_mutex_t; typedef struct { int type_; // Either USYNC_THREAD or USYNC_PROCESS union { HANDLE proc_mutex_; CRITICAL_SECTION thr_mutex_; }; } ACE_mutex_t; typedef HANDLE ACE_sema_t; // These need to be different values, neither of which can be 0... # define USYNC_THREAD 1 # define USYNC_PROCESS 2 # define THR_CANCEL_DISABLE 0 # define THR_CANCEL_ENABLE 0 # define THR_CANCEL_DEFERRED 0 # define THR_CANCEL_ASYNCHRONOUS 0 # define THR_DETACHED 0 /* ?? ignore in most places */ # define THR_BOUND 0 /* ?? ignore in most places */ # define THR_NEW_LWP 0 /* ?? ignore in most places */ # define THR_SUSPENDED CREATE_SUSPENDED # define THR_USE_AFX 0x01000000 #endif /* ACE_HAS_DCETHREADS || ACE_HAS_PTHREADS */ #if defined (ACE_LACKS_COND_T) class ACE_Export ACE_cond_t // = TITLE // This structure is used to implement condition variables on // VxWorks and Win32. // // = DESCRIPTION // At the current time, this stuff only works for threads // within the same process. { friend class ACE_OS; public: long waiters (void) const; // Returns the number of waiters. protected: long waiters_; // Number of waiting threads. ACE_thread_mutex_t waiters_lock_; // Serialize access to the waiters count. ACE_sema_t sema_; // Queue up threads waiting for the condition to become signaled. #if defined (VXWORKS) ACE_sema_t waiters_done_; // A semaphore used by the broadcast/signal thread to wait for all // the waiting thread(s) to wake up and be released from the // semaphore. #elif defined (ACE_WIN32) HANDLE waiters_done_; // An auto reset event used by the broadcast/signal thread to wait // for the waiting thread(s) to wake up and get a chance at the // semaphore. #else #error "SOMEONE FIX ME!" #endif /* VXWORKS */ size_t was_broadcast_; // Keeps track of whether we were broadcasting or just signaling. }; #endif /* ACE_LACKS_COND_T */ #if defined (ACE_LACKS_RWLOCK_T) struct ACE_Export ACE_rwlock_t // = TITLE // This is used to implement readers/writer locks on NT, // VxWorks, and POSIX pthreads. // // = DESCRIPTION // At the current time, this stuff only works for threads // within the same process. { friend class ACE_OS; protected: ACE_mutex_t lock_; // Serialize access to internal state. ACE_cond_t waiting_readers_; // Reader threads waiting to acquire the lock. int num_waiting_readers_; // Number of waiting readers. ACE_cond_t waiting_writers_; // Writer threads waiting to acquire the lock. int num_waiting_writers_; // Number of waiting writers. int ref_count_; // Value is -1 if writer has the lock, else this keeps track of the // number of readers holding the lock. }; #elif !defined (ACE_HAS_STHREADS) #include /**/ <synch.h> typedef rwlock_t ACE_rwlock_t; #endif /* ACE_LACKS_RWLOCK_T */ #else /* !ACE_HAS_THREADS, i.e., the OS/platform doesn't support threading. */ // Give these things some reasonable value... #define ACE_SCOPE_PROCESS 0 #define ACE_SCOPE_LWP 1 #define ACE_SCOPE_THREAD 2 #define ACE_SCHED_OTHER 0 #define ACE_SCHED_FIFO 1 #define ACE_SCHED_RR 2 #define THR_CANCEL_DISABLE 0 #define THR_CANCEL_ENABLE 0 #define THR_CANCEL_DEFERRED 0 #define THR_CANCEL_ASYNCHRONOUS 0 #define THR_DETACHED 0 /* ?? ignore in most places */ #define THR_DAEMON 0 /* ?? ignore in most places */ #define THR_BOUND 0 /* ?? ignore in most places */ #define THR_NEW_LWP 0 /* ?? ignore in most places */ #define THR_SUSPENDED 0 /* ?? ignore in most places */ #define USYNC_THREAD 0 #define USYNC_PROCESS 0 // These are dummies needed for class OS.h typedef int ACE_cond_t; typedef int ACE_mutex_t; typedef int ACE_thread_mutex_t; #if !defined (ACE_HAS_POSIX_SEM) typedef int ACE_sema_t; #endif /* !ACE_HAS_POSIX_SEM */ typedef int ACE_rwlock_t; typedef int ACE_thread_t; typedef int ACE_hthread_t; typedef int ACE_thread_key_t; #endif /* ACE_HAS_THREADS */ #include /**/ <sys/types.h> #include /**/ <assert.h> #include /**/ <sys/stat.h> #include /**/ <limits.h> #include /**/ <stdio.h> #include "ace/stdcpp.h" #include /**/ <new.h> #include /**/ <ctype.h> #include /**/ <signal.h> #include /**/ <string.h> #include /**/ <stdarg.h> #include /**/ <fcntl.h> #include /**/ <errno.h> #include /**/ <stdlib.h> // This must come after signal.h is #included. #if defined (SCO) #define SIGIO SIGPOLL #include /**/ <sys/regset.h> #endif /* SCO */ #if defined (ACE_HAS_SIG_MACROS) #undef sigemptyset #undef sigfillset #undef sigaddset #undef sigdelset #undef sigismember #endif /* ACE_HAS_SIG_MACROS */ // This must come after signal.h is #included. It's to counteract // the sigemptyset and sigfillset #defines, which only happen // when __OPTIMIZE__ is #defined (really!) on Linux. #if defined (linux) && defined (__OPTIMIZE__) #undef sigemptyset #undef sigfillset #endif /* linux && __OPTIMIZE__ */ // sigwait is yet another macro on Digital UNIX 4.0, // just causing trouble when introducing member functions with the same name. // Thanks to Thilo Kielmann" <kielmann@informatik.uni-siegen.de> for this fix. #if defined (DIGITAL_UNIX) #undef sigwait #endif /* DIGITAL_UNIX */ #if defined (ACE_HAS_BROKEN_SENDMSG) typedef struct msghdr ACE_SENDMSG_TYPE; #else typedef const struct msghdr ACE_SENDMSG_TYPE; #endif /* ACE_HAS_BROKEN_SENDMSG */ #if defined (ACE_HAS_BROKEN_RANDR) // The SunOS 5.x version of rand_r is inconsistent with the header files... typedef unsigned int ACE_RANDR_TYPE; extern "C" int rand_r (ACE_RANDR_TYPE seed); #else # if defined (__hpux) // HP-UX's stdlib.h (long *) doesn't match that man page (unsigned int *) typedef long *ACE_RANDR_TYPE; # else typedef unsigned int *ACE_RANDR_TYPE; # endif /* __hpux */ #endif /* ACE_HAS_BROKEN_RANDR */ #if defined (ACE_HAS_UTIME) #include /**/ <utime.h> #endif /* ACE_HAS_UTIME */ #if !defined (ACE_HAS_MSG) && !defined (SCO) struct msghdr {}; #endif /* ACE_HAS_MSG */ #if !defined (ACE_HAS_SIG_ATOMIC_T) typedef int sig_atomic_t; #endif /* !ACE_HAS_SIG_ATOMIC_T */ #if !defined (ACE_HAS_SSIZE_T) typedef int ssize_t; #endif /* ACE_HAS_SSIZE_T */ #if defined (ACE_HAS_OLD_MALLOC) typedef char *ACE_MALLOC_T; #else typedef void *ACE_MALLOC_T; #endif /* ACE_HAS_OLD_MALLOC */ #if defined (ACE_HAS_CONSISTENT_SIGNAL_PROTOTYPES) // Prototypes for both signal() and struct sigaction are consistent.. #if defined (ACE_HAS_SIG_C_FUNC) extern "C" { #endif /* ACE_HAS_SIG_C_FUNC */ typedef void (*ACE_SignalHandler)(int); typedef void (*ACE_SignalHandlerV)(int); #if defined (ACE_HAS_SIG_C_FUNC) } #endif /* ACE_HAS_SIG_C_FUNC */ #elif defined (ACE_HAS_TANDEM_SIGNALS) typedef void (*ACE_SignalHandler)(...); typedef void (*ACE_SignalHandlerV)(...); #elif defined (ACE_HAS_IRIX_53_SIGNALS) typedef void (*ACE_SignalHandler)(...); typedef void (*ACE_SignalHandlerV)(...); #elif defined (ACE_HAS_SPARCWORKS_401_SIGNALS) typedef void (*ACE_SignalHandler)(int, ...); typedef void (*ACE_SignalHandlerV)(int,...); #elif defined (ACE_HAS_SUNOS4_SIGNAL_T) typedef void (*ACE_SignalHandler)(...); typedef void (*ACE_SignalHandlerV)(...); #elif defined (ACE_HAS_SVR4_SIGNAL_T) // SVR4 Signals are inconsistent (e.g., see struct sigaction).. typedef void (*ACE_SignalHandler)(int); #if !defined (m88k) /* with SVR4_SIGNAL_T */ typedef void (*ACE_SignalHandlerV)(void); #else typedef void (*ACE_SignalHandlerV)(int); #endif // m88k /* with SVR4_SIGNAL_T */ #elif defined (ACE_WIN32) typedef void (__cdecl *ACE_SignalHandler)(int); typedef void (__cdecl *ACE_SignalHandlerV)(int); #elif defined (ACE_HAS_UNIXWARE_SVR4_SIGNAL_T) typedef void (*ACE_SignalHandler)(int); typedef void (*ACE_SignalHandlerV)(...); #else /* This is necessary for some older broken version of cfront */ #if defined (SIG_PF) #define ACE_SignalHandler SIG_PF #else typedef void (*ACE_SignalHandler)(int); #endif /* SIG_PF */ typedef void (*ACE_SignalHandlerV)(...); #endif /* ACE_HAS_CONSISTENT_SIGNAL_PROTOTYPES */ #if defined (BUFSIZ) #define ACE_STREAMBUF_SIZE BUFSIZ #else #define ACE_STREAMBUF_SIZE 1024 #endif /* BUFSIZ */ #if defined (ACE_LACKS_UTSNAME_T) #define _SYS_NMLN 257 struct utsname { char sysname[_SYS_NMLN]; char nodename[_SYS_NMLN]; char release[_SYS_NMLN]; char version[_SYS_NMLN]; char machine[_SYS_NMLN]; }; #else #include /**/ <sys/utsname.h> #endif /* ACE_LACKS_UTSNAME_T */ #if defined (ACE_WIN32) // Turn off warnings for /W4 // To resume any of these warning: #pragma warning(default: 4xxx) // which should be placed after these defines #ifndef ALL_WARNINGS // #pragma warning(disable: 4101) // unreferenced local variable #pragma warning(disable: 4127) /* constant expression for TRACE/ASSERT */ #pragma warning(disable: 4134) /* message map member fxn casts */ #pragma warning(disable: 4511) /* private copy constructors are good to have */ #pragma warning(disable: 4512) /* private operator= are good to have */ #pragma warning(disable: 4514) /* unreferenced inlines are common */ #pragma warning(disable: 4710) /* private constructors are disallowed */ #pragma warning(disable: 4705) /* statement has no effect in optimized code */ // #pragma warning(disable: 4701) // local variable *may* be used without init // #pragma warning(disable: 4702) // unreachable code caused by optimizations #pragma warning(disable: 4791) /* loss of debugging info in retail version */ // #pragma warning(disable: 4204) // non-constant aggregate initializer #pragma warning(disable: 4275) /* deriving exported class from non-exported */ #pragma warning(disable: 4251) /* using non-exported as public in exported */ #pragma warning(disable: 4786) /* identifier was truncated to '255' characters in the browser information */ #pragma warning(disable: 4097) /* typedef-name used as synonym for class-name */ #endif /*!ALL_WARNINGS */ // STRICT type checking in WINDOWS.H enhances type safety for Windows // programs by using distinct types to represent all the different // HANDLES in Windows. So for example, STRICT prevents you from // mistakenly passing an HPEN to a routine expecting an HBITMAP. // Note that we only use this if we #if defined (ACE_HAS_STRICT) && (ACE_HAS_STRICT != 0) #if !defined (STRICT) /* may already be defined */ #define STRICT #endif /* !STRICT */ #endif /* ACE_HAS_STRICT */ #include /**/ <sys/timeb.h> // The following defines are used by the ACE Name Server... #if !defined (ACE_DEFAULT_NAMESPACE_DIR_W) #define ACE_DEFAULT_NAMESPACE_DIR_W L"C:\\temp" #endif /* ACE_DEFAULT_NAMESPACE_DIR_W */ #if !defined (ACE_DEFAULT_NAMESPACE_DIR_A) #define ACE_DEFAULT_NAMESPACE_DIR_A "C:\\temp" #endif /* ACE_DEFAULT_NAMESPACE_DIR_A */ #if !defined (ACE_DEFAULT_LOCALNAME_A) #define ACE_DEFAULT_LOCALNAME_A "\\localnames" #endif /* ACE_DEFAULT_LOCALNAME_A */ #if !defined (ACE_DEFAULT_LOCALNAME_W) #define ACE_DEFAULT_LOCALNAME_W L"\\localnames" #endif /* ACE_DEFAULT_LOCALNAME_W */ #if !defined (ACE_DEFAULT_GLOBALNAME_A) #define ACE_DEFAULT_GLOBALNAME_A "\\globalnames" #endif /* ACE_DEFAULT_GLOBALNAME_A */ #if !defined (ACE_DEFAULT_GLOBALNAME_W) #define ACE_DEFAULT_GLOBALNAME_W L"\\globalnames" #endif /* ACE_DEFAULT_GLOBALNAME_W */ // Need to work around odd glitches with NT. #if !defined (ACE_MAX_DEFAULT_PORT) #define ACE_MAX_DEFAULT_PORT 0 #endif /* ACE_MAX_DEFAULT_PORT */ // We're on WinNT or Win95 #define ACE_PLATFORM_A "Win32" #define ACE_PLATFORM_EXE_SUFFIX_A ".exe" #define ACE_PLATFORM_W L"Win32" #define ACE_PLATFORM_EXE_SUFFIX_W L".exe" // Used for ACE_MMAP_Memory_Pool #if !defined (ACE_DEFAULT_BACKING_STORE) #define ACE_DEFAULT_BACKING_STORE __TEXT ("C:\\temp\\ace-malloc-XXXXXX") #endif /* ACE_DEFAULT_BACKING_STORE */ // Used for logging #if !defined (ACE_DEFAULT_LOGFILE) #define ACE_DEFAULT_LOGFILE "C:\\temp\\logfile" #endif /* ACE_DEFAULT_LOGFILE */ // Used for dynamic linking #if !defined (ACE_DEFAULT_SVC_CONF) #define ACE_DEFAULT_SVC_CONF ".\\svc.conf" #endif /* ACE_DEFAULT_SVC_CONF */ // The following are #defines and #includes that are specific to // WIN32. #define ACE_STDIN GetStdHandle (STD_INPUT_HANDLE) #define ACE_STDOUT GetStdHandle (STD_OUTPUT_HANDLE) #define ACE_STDERR GetStdHandle (STD_ERROR_HANDLE) // Default semaphore key and mutex name #if !defined (ACE_DEFAULT_SEM_KEY) #define ACE_DEFAULT_SEM_KEY "ACE_SEM_KEY" #endif /* ACE_DEFAULT_SEM_KEY */ #define ACE_INVALID_SEM_KEY 0 #define ACE_SEH_TRY __try #define ACE_SEH_EXCEPT(X) __except(X) #define ACE_SEH_FINALLY __finally // The "null" device on Win32. #define ACE_DEV_NULL "nul" // Define the pathname separator characters for Win32 (ugh). #define ACE_DIRECTORY_SEPARATOR_STR_A "\\" #define ACE_DIRECTORY_SEPARATOR_STR_W L"\\" #define ACE_DIRECTORY_SEPARATOR_CHAR_A '\\' #define ACE_DIRECTORY_SEPARATOR_CHAR_W L'\\' #define ACE_LD_SEARCH_PATH "PATH" #define ACE_LD_SEARCH_PATH_SEPARATOR_STR ";" #define ACE_LOGGER_KEY __TEXT ("\\temp\\server_daemon") #define ACE_DLL_SUFFIX ".dll" #define ACE_DLL_PREFIX "" // This will help until we figure out everything: #define NFDBITS 32 /* only used in unused functions... */ // These two may be used for internal flags soon: #define MAP_PRIVATE 1 #define MAP_SHARED 2 #define MAP_FIXED 4 #define RUSAGE_SELF 1 struct shmaddr { }; struct msqid_ds {}; // Fake the UNIX rusage structure. Perhaps we can add more to this // later on? struct rusage { FILETIME ru_utime; FILETIME ru_stime; }; // MMAP flags #define PROT_READ PAGE_READONLY #define PROT_WRITE PAGE_READWRITE #define PROT_RDWR PAGE_READWRITE /* If we can find suitable use for these flags, here they are: PAGE_WRITECOPY PAGE_EXECUTE PAGE_EXECUTE_READ PAGE_EXECUTE_READWRITE PAGE_EXECUTE_WRITECOPY PAGE_GUARD PAGE_NOACCESS PAGE_NOCACHE */ #if defined (ACE_HAS_WINSOCK2) && (ACE_HAS_WINSOCK2 != 0) #include "ace/ws2tcpip.h" #endif /* ACE_HAS_WINSOCK2 */ #define MAXHOSTNAMELEN 256 // error code mapping #define ETIME ERROR_SEM_TIMEOUT #define EWOULDBLOCK WSAEWOULDBLOCK #define EINPROGRESS WSAEINPROGRESS #define EALREADY WSAEALREADY #define ENOTSOCK WSAENOTSOCK #define EDESTADDRREQ WSAEDESTADDRREQ #define EMSGSIZE WSAEMSGSIZE #define EPROTOTYPE WSAEPROTOTYPE #define ENOPROTOOPT WSAENOPROTOOPT #define EPROTONOSUPPORT WSAEPROTONOSUPPORT #define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT #define EOPNOTSUPP WSAEOPNOTSUPP #define EPFNOSUPPORT WSAEPFNOSUPPORT #define EAFNOSUPPORT WSAEAFNOSUPPORT #define EADDRINUSE WSAEADDRINUSE #define EADDRNOTAVAIL WSAEADDRNOTAVAIL #define ENETDOWN WSAENETDOWN #define ENETUNREACH WSAENETUNREACH #define ENETRESET WSAENETRESET #define ECONNABORTED WSAECONNABORTED #define ECONNRESET WSAECONNRESET #define ENOBUFS WSAENOBUFS #define EISCONN WSAEISCONN #define ENOTCONN WSAENOTCONN #define ESHUTDOWN WSAESHUTDOWN #define ETOOMANYREFS WSAETOOMANYREFS #define ETIMEDOUT WSAETIMEDOUT #define ECONNREFUSED WSAECONNREFUSED #define ELOOP WSAELOOP #define EHOSTDOWN WSAEHOSTDOWN #define EHOSTUNREACH WSAEHOSTUNREACH #define EPROCLIM WSAEPROCLIM #define EUSERS WSAEUSERS #define EDQUOT WSAEDQUOT #define ESTALE WSAESTALE #define EREMOTE WSAEREMOTE // Grrr! These two are already defined by the horrible 'standard' // library. // #define ENAMETOOLONG WSAENAMETOOLONG // #define ENOTEMPTY WSAENOTEMPTY #include /**/ <time.h> #include /**/ <direct.h> #include /**/ <process.h> #include /**/ <io.h> typedef OVERLAPPED ACE_OVERLAPPED; typedef DWORD ACE_thread_t; typedef HANDLE ACE_hthread_t; typedef long pid_t; typedef DWORD ACE_thread_key_t; typedef DWORD nlink_t; // 64-bit quad-word definitions #if !defined (_MSC_VER) /* Borland? */ typedef uint64 ACE_QWORD; typedef ACE_QWORD ACE_hrtime_t; inline ACE_QWORD ACE_MAKE_QWORD (DWORD lo, DWORD hi) { return uint64 (lo, hi); } inline DWORD ACE_LOW_DWORD (ACE_QWORD q) { return q.LowPart; } inline DWORD ACE_HIGH_DWORD (ACE_QWORD q) { return q.HighPart; } #else typedef unsigned __int64 ACE_QWORD; typedef signed __int64 ACE_hrtime_t; /* VC++ won't convert unsigned __int64 to double */ // typedef unsigned __int64 ACE_hrtime_t; /* Why do we need this? */ inline ACE_QWORD ACE_MAKE_QWORD (DWORD lo, DWORD hi) { return ACE_QWORD (lo) | (ACE_QWORD (hi) << 32); } inline DWORD ACE_LOW_DWORD (ACE_QWORD q) { return (DWORD) q; } inline DWORD ACE_HIGH_DWORD (ACE_QWORD q) { return (DWORD) (q >> 32); } #endif /* !defined (_MSC_VER) */ // Win32 dummies to help compilation. typedef int mode_t; typedef int uid_t; typedef int gid_t; typedef char *caddr_t; struct rlimit { }; struct t_call { }; struct t_bind { }; struct t_info { }; struct t_optmgmt { }; struct t_discon { }; struct t_unitdata { }; struct t_uderr { }; struct netbuf { }; // Wrapper for NT Events. typedef HANDLE ACE_event_t; // This is for file descriptors. typedef HANDLE ACE_HANDLE; // For Win32 compatibility. typedef SOCKET ACE_SOCKET; #define ACE_INVALID_HANDLE INVALID_HANDLE_VALUE #define ACE_SYSCALL_FAILED 0xFFFFFFFF // Needed to map calls to NT transparently. #define MS_ASYNC 0 #define MS_INVALIDATE 0 // Reliance on CRT - I don't really like this. #define O_NDELAY 0 #define MAXPATHLEN _MAX_PATH #define MAXNAMLEN _MAX_FNAME #define EADDRINUSE WSAEADDRINUSE struct iovec { char *iov_base; // data to be read/written size_t iov_len; // byte count to read/write }; typedef DWORD ACE_id_t; typedef int ACE_pri_t; // Dynamic loading-related types - used for dlopen and family. #if !defined(RTLD_LAZY) # define RTLD_LAZY 1 #endif /* !RTLD_LAZY */ typedef HINSTANCE ACE_SHLIB_HANDLE; const int ACE_DEFAULT_SHLIB_MODE = 0; #else /* !defined (ACE_WIN32) */ typedef const char *LPCTSTR; typedef char *LPTSTR; typedef char TCHAR; #if !defined (__TEXT) #if (defined (ACE_HAS_UNICODE) && (defined (UNICODE))) #define __TEXT(STRING) L##STRING #else #define __TEXT(STRING) STRING #endif /* UNICODE && ACE_HAS_UNICODE */ #endif /* !defined __TEXT */ #if defined (m88k) #define RUSAGE_SELF 1 #endif /* m88k */ // Default port is MAX_SHORT. #define ACE_MAX_DEFAULT_PORT 65535 // Default semaphore key #if !defined (ACE_DEFAULT_SEM_KEY) #define ACE_DEFAULT_SEM_KEY 1234 #endif /* ACE_DEFAULT_SEM_KEY */ #define ACE_INVALID_SEM_KEY -1 // Define the pathname separator characters for UNIX. #define ACE_DIRECTORY_SEPARATOR_STR_A "/" #define ACE_DIRECTORY_SEPARATOR_CHAR_A '/' // We're some kind of UNIX... #define ACE_PLATFORM_A "UNIX" #define ACE_PLATFORM_EXE_SUFFIX_A "" #if defined (ACE_HAS_UNICODE) #define ACE_DIRECTORY_SEPARATOR_STR_W L"/" #define ACE_DIRECTORY_SEPARATOR_CHAR_W L'/' #define ACE_PLATFORM_W L"UNIX" #define ACE_PLATFORM_EXE_SUFFIX_W L"" #else #define ACE_DIRECTORY_SEPARATOR_STR_W "/" #define ACE_DIRECTORY_SEPARATOR_CHAR_W '/' #define ACE_PLATFORM_W "UNIX" #define ACE_PLATFORM_EXE_SUFFIX_W "" #endif /* ACE_HAS_UNICODE */ #define ACE_LD_SEARCH_PATH "LD_LIBRARY_PATH" #define ACE_LD_SEARCH_PATH_SEPARATOR_STR ":" #define ACE_LOGGER_KEY "/tmp/server_daemon" #if defined (__hpux) #define ACE_DLL_SUFFIX ".sl" #else #define ACE_DLL_SUFFIX ".so" #endif /* __hpux */ #define ACE_DLL_PREFIX "lib" // The following 3 defines are used by the ACE Name Server... #if !defined (ACE_DEFAULT_NAMESPACE_DIR_A) #define ACE_DEFAULT_NAMESPACE_DIR_A "/tmp" #endif /* ACE_DEFAULT_NAMESPACE_DIR_A */ #if !defined (ACE_DEFAULT_LOCALNAME_A) #define ACE_DEFAULT_LOCALNAME_A "/localnames" #endif /* ACE_DEFAULT_LOCALNAME_A */ #if !defined (ACE_DEFAULT_GLOBALNAME_A) #define ACE_DEFAULT_GLOBALNAME_A "/globalnames" #endif /* ACE_DEFAULT_GLOBALNAME_A */ #if defined (ACE_HAS_UNICODE) #if !defined (ACE_DEFAULT_NAMESPACE_DIR_W) #define ACE_DEFAULT_NAMESPACE_DIR_W L"/tmp" #endif /* ACE_DEFAULT_NAMESPACE_DIR_W */ #if !defined (ACE_DEFAULT_LOCALNAME_W) #define ACE_DEFAULT_LOCALNAME_W L"/localnames" #endif /* ACE_DEFAULT_LOCALNAME_W */ #if !defined (ACE_DEFAULT_GLOBALNAME_W) #define ACE_DEFAULT_GLOBALNAME_W L"/globalnames" #endif /* ACE_DEFAULT_GLOBALNAME_W */ #else #if !defined (ACE_DEFAULT_NAMESPACE_DIR_W) #define ACE_DEFAULT_NAMESPACE_DIR_W "/tmp" #endif /* ACE_DEFAULT_NAMESPACE_DIR_W */ #if !defined (ACE_DEFAULT_LOCALNAME_W) #define ACE_DEFAULT_LOCALNAME_W "/localnames" #endif /* ACE_DEFAULT_LOCALNAME_W */ #if !defined (ACE_DEFAULT_GLOBALNAME_W) #define ACE_DEFAULT_GLOBALNAME_W "/globalnames" #endif /* ACE_DEFAULT_GLOBALNAME_W */ #endif /* ACE_HAS_UNICODE */ // Used for ACE_MMAP_Memory_Pool #if !defined (ACE_DEFAULT_BACKING_STORE) #define ACE_DEFAULT_BACKING_STORE "/tmp/ace-malloc-XXXXXX" #endif /* ACE_DEFAULT_BACKING_STORE */ // Used for logging #if !defined (ACE_DEFAULT_LOGFILE) #define ACE_DEFAULT_LOGFILE "/tmp/logfile" #endif /* ACE_DEFAULT_LOGFILE */ // Used for dynamic linking. #if !defined (ACE_DEFAULT_SVC_CONF) #define ACE_DEFAULT_SVC_CONF "./svc.conf" #endif /* ACE_DEFAULT_SVC_CONF */ // The following are #defines and #includes that are specific to UNIX. #define ACE_STDIN 0 #define ACE_STDOUT 1 #define ACE_STDERR 2 // Be consistent with Winsock naming #define ACE_INVALID_HANDLE -1 #define ACE_SYSCALL_FAILED -1 #define ACE_SEH_TRY #define ACE_SEH_EXCEPT(X) #define ACE_SEH_FINALLY // The "null" device on UNIX. #define ACE_DEV_NULL "/dev/null" // Wrapper for NT events on UNIX. class ACE_Export ACE_event_t { friend class ACE_OS; protected: ACE_mutex_t lock_; // Protect critical section. ACE_cond_t condition_; // Keeps track of waiters. int manual_reset_; // Specifies if this is an auto- or manual-reset event. int is_signaled_; // "True" if signaled. u_long waiting_threads_; // Number of waiting threads. }; // Provide compatibility with Windows NT. typedef int ACE_HANDLE; // For Win32 compatibility. typedef ACE_HANDLE ACE_SOCKET; struct ACE_OVERLAPPED { u_long Internal; u_long InternalHigh; u_long Offset; u_long OffsetHigh; ACE_HANDLE hEvent; }; // Add some typedefs and macros to enhance Win32 conformance... #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 (ACE_HAS_BROKEN_IF_HEADER) struct ifafilt; #endif /* ACE_HAS_BROKEN_IF_HEADER */ #if defined (ACE_HAS_AIX_BROKEN_SOCKET_HEADER) #undef __cplusplus #include /**/ <sys/socket.h> #define __cplusplus #else #include /**/ <sys/socket.h> #endif /* ACE_HAS_AIX_BROKEN_SOCKET_HEADER */ extern "C" { #if defined (VXWORKS) struct hostent { char *h_name; /* official name of host */ 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 */ }; #else #include /**/ <netdb.h> #endif /* VXWORKS */ #include /**/ <net/if.h> #include /**/ <netinet/in.h> #include /**/ <arpa/inet.h> } #if !defined (ACE_LACKS_TCP_H) #include /**/ <netinet/tcp.h> #endif /* ACE_LACKS_TCP_H */ #if defined (CHORUS) #include /**/ <chorus.h> #include /**/ <cx/select.h> #include /**/ <sys/uio.h> #include /**/ <time.h> #include /**/ <stdfileio.h> #include /**/ <am/afexec.h> // This must come after limits.h is included #define MAXPATHLEN _POSIX_PATH_MAX typedef cx_fd_mask fd_mask; #ifndef howmany #define howmany(x, y) (((x)+((y)-1))/(y)) #endif /* howmany */ typedef void (*__sighandler_t)(int); // keep Signal compilation happy #elif ! defined (VXWORKS) #include /**/ <sys/uio.h> #include /**/ <sys/ipc.h> #include /**/ <sys/shm.h> #include /**/ <sys/sem.h> #include /**/ <sys/file.h> #include /**/ <sys/time.h> #include /**/ <sys/resource.h> #include /**/ <sys/wait.h> #include /**/ <pwd.h> #endif /* ! VXWORKS */ #include /**/ <sys/ioctl.h> #include /**/ <dirent.h> #include /**/ <unistd.h> #if !defined (ACE_LACKS_PARAM_H) #include /**/ <sys/param.h> #endif /* ACE_LACKS_PARAM_H */ #if !defined (ACE_LACKS_UNIX_DOMAIN_SOCKETS) && !defined (VXWORKS) #include /**/ <sys/un.h> #endif /* ACE_LACKS_UNIX_DOMAIN_SOCKETS */ #if defined (ACE_HAS_SIGINFO_T) #if !defined (ACE_LACKS_SIGINFO_H) #include /**/ <siginfo.h> #endif /* ACE_LACKS_SIGINFO_H */ #if !defined (ACE_LACKS_UCONTEXT_H) #include /**/ <ucontext.h> #endif /* ACE_LACKS_UCONTEXT_H */ #endif /* ACE_HAS_SIGINFO_T */ #if defined (ACE_HAS_POLL) #include /**/ <poll.h> #endif /* ACE_HAS_POLL */ #if defined (ACE_HAS_STREAMS) #if defined (AIX) #if !defined (_XOPEN_EXTENDED_SOURCE) #define _XOPEN_EXTENDED_SOURCE #endif /* !_XOPEN_EXTENDED_SOURCE */ #include /**/ <stropts.h> #undef _XOPEN_EXTENDED_SOURCE #else #include /**/ <stropts.h> #endif /* AIX */ #endif /* ACE_HAS_STREAMS */ #if defined (ACE_LACKS_T_ERRNO) extern int t_errno; #endif /* ACE_LACKS_T_ERRNO */ #if !defined (ACE_HAS_SIGWAIT) extern "C" int sigwait (sigset_t *set); #endif /* ACE_HAS_SIGWAIT */ #if defined (ACE_HAS_SELECT_H) #include /**/ <sys/select.h> #endif /* ACE_HAS_SELECT_H */ #if defined (ACE_HAS_ALLOCA_H) #include /**/ <alloca.h> #endif /* ACE_HAS_ALLOCA_H */ #if defined (ACE_HAS_TIUSER_H) #include /**/ <tiuser.h> #endif /* ACE_HAS_TIUSER_H */ /* Set the proper handle type for dynamically-loaded libraries. */ /* Also define a default 'mode' for loading a library - the names and values */ /* differ between OSes, so if you write code that uses the mode, be careful */ /* of the platform differences. */ #if defined (ACE_HAS_SVR4_DYNAMIC_LINKING) # include /**/ <dlfcn.h> typedef void *ACE_SHLIB_HANDLE; #if !defined (RTLD_LAZY) #define RTLD_LAZY 1 #endif /* !RTLD_LAZY */ const int ACE_DEFAULT_SHLIB_MODE = RTLD_LAZY; #elif defined (__hpux) # if __cplusplus >= 199707L # include /**/ <dl.h> # else # include /**/ <cxxdl.h> # endif /* HP aC++ vs. HP C++ */ typedef shl_t ACE_SHLIB_HANDLE; const int ACE_DEFAULT_SHLIB_MODE = BIND_DEFERRED; #else #if !defined(RTLD_LAZY) # define RTLD_LAZY 1 #endif /* !RTLD_LAZY */ typedef void *ACE_SHLIB_HANDLE; const int ACE_DEFAULT_SHLIB_MODE = RTLD_LAZY; #endif /* ACE_HAS_SVR4_DYNAMIC_LINKING */ #if defined (ACE_HAS_SOCKIO_H) #include /**/ <sys/sockio.h> #endif /* ACE_HAS_SOCKIO_ */ // There must be a better way to do this... #if !defined (RLIMIT_NOFILE) #if defined (linux) || defined (AIX) || defined (SCO) #if defined (RLIMIT_OFILE) #define RLIMIT_NOFILE RLIMIT_OFILE #else #define RLIMIT_NOFILE 200 #endif /* RLIMIT_OFILE */ #endif /* defined (linux) || defined (AIX) || defined (SCO) */ #endif /* RLIMIT_NOFILE */ #if !defined (ACE_HAS_TLI_PROTOTYPES) // Define ACE_TLI headers for systems that don't prototype them.... extern "C" { int t_accept(int fildes, int resfd, struct t_call *call); char *t_alloc(int fildes, int struct_type, int fields); int t_bind(int fildes, struct t_bind *req, struct t_bind *ret); int t_close(int fildes); int t_connect(int fildes, struct t_call *sndcall, struct t_call *rcvcall); void t_error(char *errmsg); int t_free(char *ptr, int struct_type); int t_getinfo(int fildes, struct t_info *info); int t_getname (int fildes, struct netbuf *namep, int type); int t_getstate(int fildes); int t_listen(int fildes, struct t_call *call); int t_look(int fildes); int t_open(char *path, int oflag, struct t_info *info); int t_optmgmt(int fildes, struct t_optmgmt *req, struct t_optmgmt *ret); int t_rcv(int fildes, char *buf, unsigned nbytes, int *flags); int t_rcvconnect(int fildes, struct t_call *call); int t_rcvdis(int fildes, struct t_discon *discon); int t_rcvrel(int fildes); int t_rcvudata(int fildes, struct t_unitdata *unitdata, int *flags); int t_rcvuderr(int fildes, struct t_uderr *uderr); int t_snd(int fildes, char *buf, unsigned nbytes, int flags); int t_snddis(int fildes, struct t_call *call); int t_sndrel(int fildes); int t_sndudata(int fildes, struct t_unitdata *unitdata); int t_sync(int fildes); int t_unbind(int fildes); } #endif /* !ACE_HAS_TLI_PROTOTYPES */ // IRIX5 defines bzero() in this odd file... #if defined (ACE_HAS_BSTRING) #include /**/ <bstring.h> #endif /* ACE_HAS_BSTRING */ // AIX defines bzero() in this odd file... #if defined (ACE_HAS_STRINGS) #include /**/ <strings.h> #endif /* ACE_HAS_STRINGS */ #if defined (ACE_HAS_TERM_IOCTLS) #include /**/ <sys/termios.h> #endif /* ACE_HAS_TERM_IOCTLS */ #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 */ // Fixes a problem with HP/UX. #if defined (ACE_HAS_BROKEN_MMAP_H) extern "C" { #include /**/ <sys/mman.h> } #elif !defined (ACE_LACKS_MMAP) #include /**/ <sys/mman.h> #endif /* ACE_HAS_BROKEN_MMAP_H */ // OSF1 has problems with sys/msg.h and C++... #if defined (ACE_HAS_BROKEN_MSG_H) #define _KERNEL #endif /* ACE_HAS_BROKEN_MSG_H */ #if !defined (ACE_LACKS_SYSV_MSG_H) #include /**/ <sys/msg.h> #endif /* ACE_LACKS_SYSV_MSG_H */ #if defined (ACE_HAS_BROKEN_MSG_H) #undef _KERNEL #endif /* ACE_HAS_BROKEN_MSG_H */ #if defined (ACE_LACKS_SYSV_MSQ_PROTOS) extern "C" { int msgget (key_t, int); int msgrcv (int, void *, size_t, long, int); int msgsnd (int, const void *, size_t, int); int msgctl (int, int, struct msqid_ds *); } #endif /* ACE_LACKS_SYSV_MSQ_PROTOS */ #if defined (ACE_HAS_STHREADS) #include /**/ <sys/priocntl.h> #if defined (ACE_LACKS_PRI_T) typedef int pri_t; #endif /* ACE_LACKS_PRI_T */ typedef id_t ACE_id_t; typedef pri_t ACE_pri_t; #else typedef long ACE_id_t; typedef short ACE_pri_t; #endif /* ACE_HAS_STHREADS */ #if defined (ACE_HAS_HI_RES_TIMER) /* hrtime_t is defined on systems (Suns) with ACE_HAS_HI_RES_TIMER */ typedef hrtime_t ACE_hrtime_t; #elif defined (ACE_HAS_LONGLONG_T) typedef unsigned long long ACE_hrtime_t; #else class ACE_Export ACE_U_LongLong // = TITLE // Unsigned long long for platforms that don't have one. // // = DESCRIPTION // Provide our own unsigned long long. This is intended to be // use with ACE_High_Res_Timer, so the division operator assumes // that the quotient fits into a u_long. // Please note that the constructor takes (optionally) two values. // The high one contributes 0x100000000 times its value. So, // for example, (0, 2) is _not_ 20000000000, but instead // 0x200000000. To emphasize this, the default values are expressed // in hex, and dump () outputs the value in hex. { public: // = Initialization and termination methods. ACE_U_LongLong (u_long lo = 0x0, u_long hi = 0x0); ACE_U_LongLong (const ACE_U_LongLong &); ACE_U_LongLong &operator= (const ACE_U_LongLong &); ~ACE_U_LongLong (void) {} // = Overloaded relation operators. int operator== (const ACE_U_LongLong &) const; int operator< (const ACE_U_LongLong &) const; int operator<= (const ACE_U_LongLong &) const; int operator> (const ACE_U_LongLong &) const; int operator>= (const ACE_U_LongLong &) const; ACE_U_LongLong operator+ (const ACE_U_LongLong &) const; ACE_U_LongLong operator- (const ACE_U_LongLong &) const; u_long operator/ (u_long) const; ACE_U_LongLong &operator+= (const ACE_U_LongLong &); ACE_U_LongLong &operator-= (const ACE_U_LongLong &); // = Helper methods. void dump (FILE * = stdout) const; // Outputs the value to the FILE, in hex. u_long hi (void) const { return hi_; } u_long lo (void) const { return lo_; } void hi (u_long hi) { hi_ = hi; } void lo (u_long lo) { lo_ = lo; } ACE_ALLOC_HOOK_DECLARE; private: u_long hi_; u_long lo_; }; typedef ACE_U_LongLong ACE_hrtime_t; #endif /* ACE_HAS_HI_RES_TIMER */ #endif /* ACE_WIN32 */ #if defined (ACE_SELECT_USES_INT) typedef int ACE_FD_SET_TYPE; #else typedef fd_set ACE_FD_SET_TYPE; #endif /* ACE_SELECT_USES_INT */ #if !defined (MAXNAMELEN) #if defined (FILENAME_MAX) #define MAXNAMELEN FILENAME_MAX #else #define MAXNAMELEN 256 #endif /* FILENAME_MAX */ #endif /* MAXNAMELEN */ #if defined (ACE_LACKS_SIGSET) typedef unsigned int sigset_t; #endif /* ACE_LACKS_SIGSET */ #if defined (ACE_LACKS_SIGACTION) struct sigaction { int sa_flags; ACE_SignalHandlerV sa_handler; sigset_t sa_mask; }; #endif /* ACE_LACKS_SIGACTION */ // This one exists only to please Service_Config.h and // Service_Manager.cpp #if !defined (SIGHUP) #define SIGHUP 1 #endif /* SIGHUP */ #if !defined (SIGINT) #define SIGINT 2 #endif /* SIGINT */ #if !defined (SIGSEGV) #define SIGSEGV 11 #endif /* SIGSEGV */ #if !defined (SIG_DFL) #define SIG_DFL ((__sighandler_t)0) #endif /* SIG_DFL */ #if !defined (SIG_IGN) #define SIG_IGN ((__sighandler_t)1) /* ignore signal */ #endif /* SIG_IGN */ #if !defined (SIG_ERR) #define SIG_ERR ((__sighandler_t)-1) /* error return from signal */ #endif /* SIG_ERR */ #if !defined (SIGIO) #define SIGIO 29 #endif /* SIGSEGV */ #if !defined (SIGCHLD) #define SIGCHLD 18 #endif /* SIGCHLD */ #if !defined (SIGQUIT) #define SIGQUIT 3 #endif /* SIGQUIT */ #if !defined (SIGPIPE) #define SIGPIPE 13 #endif /* SIGPIPE */ #if !defined (O_NONBLOCK) #define O_NONBLOCK 1 #endif /* O_NONBLOCK */ #if !defined (SIG_BLOCK) #define SIG_BLOCK 1 #endif /* SIG_BLOCK */ #if !defined (SIG_UNBLOCK) #define SIG_UNBLOCK 2 #endif /* SIG_UNBLOCK */ #if !defined (SIG_SETMASK) #define SIG_SETMASK 3 #endif /* SIG_SETMASK */ #if !defined (IPC_CREAT) #define IPC_CREAT 0 #endif /* IPC_CREAT */ #if !defined (IPC_NOWAIT) #define IPC_NOWAIT 0 #endif /* IPC_NOWAIT */ #if !defined (IPC_RMID) #define IPC_RMID 0 #endif /* IPC_RMID */ #if !defined (IPC_EXCL) #define IPC_EXCL 0 #endif /* IPC_EXCL */ #if !defined (IP_DROP_MEMBERSHIP) #define IP_DROP_MEMBERSHIP 0 #endif /* IP_DROP_MEMBERSHIP */ #if !defined (IP_ADD_MEMBERSHIP) #define IP_ADD_MEMBERSHIP 0 #endif /* IP_ADD_MEMBERSHIP */ #if !defined (SIOCGIFADDR) #define SIOCGIFADDR 0 #endif /* SIOCGIFADDR */ #if !defined (IPC_PRIVATE) #define IPC_PRIVATE ACE_INVALID_SEM_KEY #endif /* IPC_PRIVATE */ #if !defined (IPC_STAT) #define IPC_STAT 0 #endif /* IPC_STAT */ #if !defined (GETVAL) #define GETVAL 0 #endif /* GETVAL */ #if !defined (F_GETFL) #define F_GETFL 0 #endif /* F_GETFL */ #if !defined (SETVAL) #define SETVAL 0 #endif /* SETVAL */ #if !defined (GETALL) #define GETALL 0 #endif /* GETALL */ #if !defined (SETALL) #define SETALL 0 #endif /* SETALL */ #if !defined (SEM_UNDO) #define SEM_UNDO 0 #endif /* SEM_UNDO */ // Why is this defined? It must be a std C library symbol. #if !defined (NSIG) #define NSIG 0 #endif /* NSIG */ #if !defined (R_OK) #define R_OK 04 /* Test for Read permission. */ #endif /* R_OK */ #if !defined (W_OK) #define W_OK 02 /* Test for Write permission. */ #endif /* W_OK */ #if !defined (X_OK) #define X_OK 01 /* Test for eXecute permission. */ #endif /* X_OK */ #if !defined (F_OK) #define F_OK 0 /* Test for existence of File. */ #endif /* F_OK */ #if !defined (EIDRM) #define EIDRM 0 #endif /* !EIDRM */ #if !defined (ENOTSUP) #define ENOTSUP ENOSYS /* Operation not supported . */ #endif /* !ENOTSUP */ #if !defined (WNOHANG) #define WNOHANG 42 #endif /* !WNOHANG */ #if !defined (EDEADLK) #define EDEADLK 1000 /* Some large number.... */ #endif /* !ENOTSUP */ #if !defined (MS_SYNC) #define MS_SYNC 0x0 #endif /* !MS_SYNC */ #if !defined (PIPE_BUF) #define PIPE_BUF 5120 #endif /* PIPE_BUF */ #if !defined (PROT_RDWR) #define PROT_RDWR (PROT_READ|PROT_WRITE) #endif /* PROT_RDWR */ #if !defined (WNOHANG) #define WNOHANG 0 #endif /* WNOHANG */ #if defined (ACE_HAS_POSIX_NONBLOCK) #define ACE_NONBLOCK O_NONBLOCK #else #define ACE_NONBLOCK O_NDELAY #endif /* ACE_HAS_POSIX_NONBLOCK */ #define LOCALNAME 0 #define REMOTENAME 1 #if defined (ACE_HAS_64BIT_LONGS) // Necessary to support the Alphas, which have 64 bit longs and 32 bit // ints... typedef u_int ACE_UINT32; typedef int ACE_INT32; #else typedef u_long ACE_UINT32; typedef long ACE_INT32; #endif /* ACE_HAS_64BIT_LONGS */ #if !defined (ETIMEDOUT) && defined (ETIME) #define ETIMEDOUT ETIME #endif /* ETIMEDOUT */ #if !defined (ETIME) && defined (ETIMEDOUT) #define ETIME ETIMEDOUT #endif /* ETIMED */ #if !defined (_SC_TIMER_MAX) #define _SC_TIMER_MAX 44 #endif /* _SC_TIMER_MAX */ // Default number of <ACE_Event_Handler>s supported by // <ACE_Timer_Heap>. #if !defined (ACE_DEFAULT_TIMERS) #define ACE_DEFAULT_TIMERS _SC_TIMER_MAX #endif /* ACE_DEFAULT_TIMERS */ // Note that this assumes shorts are 16 bits. typedef u_short ACE_USHORT16; #if defined (ACE_HAS_STRUCT_NETDB_DATA) typedef char ACE_HOSTENT_DATA[sizeof(struct hostent_data)]; typedef char ACE_SERVENT_DATA[sizeof(struct servent_data)]; typedef char ACE_PROTOENT_DATA[sizeof(struct protoent_data)]; #else #if !defined ACE_HOSTENT_DATA_SIZE #define ACE_HOSTENT_DATA_SIZE (4*1024) #endif /*ACE_HOSTENT_DATA_SIZE */ #if !defined ACE_SERVENT_DATA_SIZE #define ACE_SERVENT_DATA_SIZE (4*1024) #endif /*ACE_SERVENT_DATA_SIZE */ #if !defined ACE_PROTOENT_DATA_SIZE #define ACE_PROTOENT_DATA_SIZE (2*1024) #endif /*ACE_PROTOENT_DATA_SIZE */ typedef char ACE_HOSTENT_DATA[ACE_HOSTENT_DATA_SIZE]; typedef char ACE_SERVENT_DATA[ACE_SERVENT_DATA_SIZE]; typedef char ACE_PROTOENT_DATA[ACE_PROTOENT_DATA_SIZE]; #endif /* ACE_HAS_STRUCT_NETDB_DATA */ #if !defined (ACE_HAS_SEMUN) union semun { int val; // value for SETVAL struct semid_ds *buf; // buffer for IPC_STAT & IPC_SET u_short *array; // array for GETALL & SETALL }; #endif /* !ACE_HAS_SEMUN */ // Max size of an ACE Log Record data buffer. This can be reset in // the config.h file if you'd like to increase or decrease the size. #if !defined (ACE_MAXLOGMSGLEN) #define ACE_MAXLOGMSGLEN 4 * 1024 #endif /* ACE_MAXLOGMSGLEN */ // Max size of an ACE Token. #define ACE_MAXTOKENNAMELEN 40 // Max size of an ACE Token client ID. #define ACE_MAXCLIENTIDLEN MAXHOSTNAMELEN + 20 // Create some useful typedefs. typedef const char **SYS_SIGLIST; // This is for C++ static methods. #if defined (VXWORKS) typedef FUNCPTR ACE_THR_FUNC; // where typedef int (*FUNCPTR) (...) #else typedef void *(*ACE_THR_FUNC)(void *); #endif /* VXWORKS */ extern "C" { typedef void (*ACE_THR_C_DEST)(void *); } typedef void (*ACE_THR_DEST)(void *); extern "C" { #if defined (ACE_WIN32) typedef unsigned (__stdcall *ACE_THR_C_FUNC) (void*); #elif defined (VXWORKS) typedef FUNCPTR ACE_THR_C_FUNC; // where typedef int (*FUNCPTR) (...) #else typedef void *(*ACE_THR_C_FUNC)(void *); #endif /* ACE_WIN32 */ } #if !defined (MAP_FAILED) #define MAP_FAILED ((void *) -1) #elif defined (ACE_HAS_LONG_MAP_FAILED) #undef MAP_FAILED #define MAP_FAILED ((void *) -1L) #endif /* MAP_FAILED */ #if defined (ACE_HAS_CHARPTR_DL) typedef char * ACE_DL_TYPE; #if defined (ACE_HAS_UNICODE) typedef wchar_t * ACE_WIDE_DL_TYPE; #endif /* ACE_HAS_UNICODE */ #else typedef const char * ACE_DL_TYPE; #if defined (ACE_HAS_UNICODE) typedef const wchar_t * ACE_WIDE_DL_TYPE; #endif /* ACE_HAS_UNICODE */ #endif /* ACE_HAS_CHARPTR_DL */ #if !defined (ACE_HAS_SIGINFO_T) struct ACE_Export siginfo_t { siginfo_t (ACE_HANDLE handle); siginfo_t (ACE_HANDLE *handles); // JCEJ 12/23/96 ACE_HANDLE si_handle_; // Win32 HANDLE that has become signaled. ACE_HANDLE *si_handles_; // Array of Win32 HANDLEs all of which have become signaled. }; #endif /* ACE_HAS_SIGINFO_T */ #if !defined (ACE_HAS_UCONTEXT_T) typedef int ucontext_t; #endif /* ACE_HAS_UCONTEXT_T */ #if !defined (SA_SIGINFO) #define SA_SIGINFO 0 #endif /* SA_SIGINFO */ #if !defined (SA_RESTART) #define SA_RESTART 0 #endif /* SA_RESTART */ #if defined (ACE_HAS_TIMOD_H) #include /**/ <sys/timod.h> #elif defined (ACE_HAS_OSF_TIMOD_H) #include /**/ <tli/timod.h> #endif /* ACE_HAS_TIMOD_H */ #if defined (ACE_HAS_BROKEN_T_ERRNO) #undef t_errno #endif /* ACE_HAS_BROKEN_T_ERRNO */ class ACE_Export ACE_Thread_ID // = TITLE // Defines a platform-independent thread ID. { public: // = Initialization method. ACE_Thread_ID (ACE_thread_t, ACE_hthread_t); // = Set/Get the Thread ID. ACE_thread_t id (void); void id (ACE_thread_t); // = Set/Get the Thread handle. ACE_hthread_t handle (void); void handle (ACE_hthread_t); // != Comparison operator. int operator == (const ACE_Thread_ID &); int operator != (const ACE_Thread_ID &); private: ACE_thread_t thread_id_; // Identify the thread. ACE_hthread_t thread_handle_; // Handle to the thread (typically used to "wait" on Win32). }; // Type of the extended signal handler. typedef void (*ACE_Sig_Handler_Ex) (int, siginfo_t *siginfo, ucontext_t *ucontext); // If the xti.h file redefines the function names, do it now, else // when the function definitions are encountered, they won't match the // declaration here. #if defined (ACE_REDEFINES_XTI_FUNCTIONS) #include /**/ <xti.h> #if defined (UNIXWARE) /* They apparantly forgot one... */ extern "C" int _xti_error(char *); #endif /* UNIXWARE */ #endif /* ACE_REDEFINES_XTI_FUNCTIONS */ // = The ACE_Sched_Priority type should be used for platform- // independent thread and process priorities, by convention. // int should be used for OS-specific priorities. typedef int ACE_Sched_Priority; // forward declaration class ACE_Sched_Params; #if defined (ACE_LACKS_FILELOCKS) #if ! defined (VXWORKS) // VxWorks defines struct flock in sys/fcntlcom.h. But it doesn't // appear to support flock (). struct flock { short l_type; short l_whence; off_t l_start; off_t l_len; /* len == 0 means until end of file */ long l_sysid; pid_t l_pid; long l_pad[4]; /* reserve area */ }; #endif /* ! VXWORKS */ #endif /* ACE_LACKS_FILELOCKS */ #if !defined (ACE_HAS_IP_MULTICAST) struct ip_mreq { struct in_addr imr_multiaddr; // IP multicast address of group struct in_addr imr_interface; // local IP address of interface }; #endif /* ACE_HAS_IP_MULTICAST */ #if !defined (ACE_HAS_STRBUF_T) struct strbuf { int maxlen; // no. of bytes in buffer. int len; // no. of bytes returned. void *buf; // pointer to data. }; #endif /* ACE_HAS_STRBUF_T */ struct ACE_Export ACE_Str_Buf : public strbuf // = TITLE // Simple wrapper for STREAM pipes strbuf. { // = Initialization method ACE_Str_Buf (void *b = 0, int l = 0, int max = 0); // Constructor. ACE_Str_Buf (strbuf &); // Constructor. }; #if defined (ACE_HAS_BROKEN_BITSHIFT) #define ACE_MSB_MASK (~(ACE_UINT32 (1) << ACE_UINT32 (NFDBITS - 1))) #else // This needs to go here to avoid overflow problems on some compilers. #define ACE_MSB_MASK (~(1 << (NFDBITS - 1))) #endif /* ACE_HAS_BROKEN_BITSHIFT */ class ACE_Export ACE_OS // = TITLE // This class defines an operating system independent // programming API that shields developers from non-portable // aspects of writing efficient system programs on Win32, POSIX, // and other versions of UNIX. If you are porting ACE to a new // platform, this is the place to focus your attention. Please // see the README file in this directory for complete // information on the meaning of the various macros. // // = DESCRIPTION // This class encapsulates all the differences between various // versions of UNIX and WIN32! The other components in // ACE are programmed to use only the methods in this class, // which makes it *much* easier to move ACE to a new platform. // The methods in this class also automatically restart when // interrupts occur during system calls (assuming that the // <ACE_Log_Msg::restart> flag is enabled). { public: struct ace_flock_t // = TITLE // OS file locking structure. { void dump (void) const; // Dump state of the object. #if defined (ACE_WIN32) ACE_OVERLAPPED overlapped_; #else struct flock lock_; #endif /* ACE_WIN32 */ ACE_HANDLE handle_; // Handle to the underlying file. }; // = A set of wrappers for miscellaneous operations. static int atoi (const char *s); static char *getenv (const char *symbol); static int getopt (int argc, char *const *argv, const char *optstring); static long sysconf (int); // = A set of wrappers for condition variables. static int cond_broadcast (ACE_cond_t *cv); static int cond_destroy (ACE_cond_t *cv); static int cond_init (ACE_cond_t *cv, int type = USYNC_THREAD, LPCTSTR name = 0, void *arg = 0); static int cond_signal (ACE_cond_t *cv); static int cond_timedwait (ACE_cond_t *cv, ACE_mutex_t *m, ACE_Time_Value *); static int cond_wait (ACE_cond_t *cv, ACE_mutex_t *m); #if defined (ACE_WIN32) && defined (ACE_HAS_WTHREADS) static int cond_timedwait (ACE_cond_t *cv, ACE_thread_mutex_t *m, ACE_Time_Value *); static int cond_wait (ACE_cond_t *cv, ACE_thread_mutex_t *m); #endif /* ACE_WIN32 && ACE_HAS_WTHREADS */ // = A set of wrappers for determining config info. static LPTSTR cuserid (LPTSTR user, size_t maxlen = 32); static int uname (struct utsname *name); static long sysinfo (int cmd, char *buf, long count); static int hostname (char *name, size_t maxnamelen); // = A set of wrappers for explicit dynamic linking. static int dlclose (ACE_SHLIB_HANDLE handle); static char *dlerror (void); static ACE_SHLIB_HANDLE dlopen (ACE_DL_TYPE filename, int mode = ACE_DEFAULT_SHLIB_MODE); static void *dlsym (ACE_SHLIB_HANDLE handle, ACE_DL_TYPE symbol); // = A set of wrappers for stdio file operations. static int last_error (void); static void last_error (int); static int fclose (FILE *fp); static int fcntl (ACE_HANDLE handle, int cmd, int val = 0); static int fdetach (const char *file); static FILE *fdopen (ACE_HANDLE handle, const char *mode); static char *fgets (char *buf, int size, FILE *fp); static int fflush (FILE *fp); static FILE *fopen (const char *filename, const char *mode); static int fprintf (FILE *fp, const char *format, ...); static size_t fread (void *ptr, size_t size, size_t nelems, FILE *fp); static int fstat (ACE_HANDLE, struct stat *); static int stat (const char *file, struct stat *); static int ftruncate (ACE_HANDLE, off_t); static size_t fwrite (const void *ptr, size_t size, size_t nitems, FILE *fp); static char *gets (char *str); static void perror (const char *s); static int printf (const char *format, ...); static int puts (const char *s); static void rewind (FILE *fp); static int sprintf (char *buf, const char *format, ...); static int vsprintf (char *buffer, const char *format, va_list argptr); // = A set of wrappers for file locks. static int flock_init (ACE_OS::ace_flock_t *lock, int flags = 0, LPCTSTR name = 0, mode_t perms = 0); static int flock_destroy (ACE_OS::ace_flock_t *lock); static int flock_rdlock (ACE_OS::ace_flock_t *lock, short whence = 0, off_t start = 0, off_t len = 0); static int flock_tryrdlock (ACE_OS::ace_flock_t *lock, short whence = 0, off_t start = 0, off_t len = 0); static int flock_trywrlock (ACE_OS::ace_flock_t *lock, short whence = 0, off_t start = 0, off_t len = 0); static int flock_unlock (ACE_OS::ace_flock_t *lock, short whence = 0, off_t start = 0, off_t len = 0); static int flock_wrlock (ACE_OS::ace_flock_t *lock, short whence = 0, off_t start = 0, off_t len = 0); // = A set of wrappers for low-level process operations. static int execl (const char *path, const char *arg0, ...); static int execle (const char *path, const char *arg0, ...); static int execlp (const char *file, const char *arg0, ...); static int execv (const char *path, char *const argv[]); static int execvp (const char *file, char *const argv[]); static int execve (const char *path, char *const argv[], char *const envp[]); static void _exit (int status = 0); static void exit (int status = 0); static pid_t fork (void); static pid_t fork (const char *program_name); static pid_t fork_exec (char *argv[]); // Forks and exec's a process in a manner that works on Solaris and // NT. argv[0] must be the full path name to the executable. static gid_t getgid (void); static pid_t getpid (void); static pid_t getpgid (pid_t pid); static uid_t getuid (void); static pid_t setsid (void); static int system (const char *s); static pid_t wait (int * = 0); static pid_t waitpid (pid_t, int * = 0, int = 0); // = A set of wrappers for timers and resource stats. static u_int alarm (u_int delay); static ACE_hrtime_t gethrtime (void); #if defined (ACE_HAS_POWERPC) && defined (ghs) static void readPPCTimeBase (u_long &most, u_long &least); #endif /* ACE_HAS_POWERPC && ghs */ static int clock_gettime (clockid_t, struct timespec *); static ACE_Time_Value gettimeofday (void); static int getrusage (int who, struct rusage *rusage); static int getrlimit (int resource, struct rlimit *rl); static int setrlimit (int resource, ACE_SETRLIMIT_TYPE *rl); static int sleep (u_int seconds); static int sleep (const ACE_Time_Value &tv); static int nanosleep (const struct timespec *requested, struct timespec *remaining = 0); #if defined (ACE_HAS_BROKEN_R_ROUTINES) #undef ctime_r #undef asctime_r #undef rand_r #undef getpwnam_r #endif /* ACE_HAS_BROKEN_R_ROUTINES */ #if defined (difftime) #define ACE_DIFFTIME(t1, t0) difftime(t1,t0) #undef difftime #endif /* difftime */ // = A set of wrappers for operations on time. static double difftime (time_t t1, time_t t0); static time_t time (time_t *tloc); static time_t mktime (struct tm *timeptr); static struct tm *localtime (const time_t *clock); static struct tm *localtime_r (const time_t *clock, struct tm *res); static struct tm *gmtime (const time_t *clock); static struct tm *gmtime_r (const time_t *clock, struct tm *res); static char *asctime (const struct tm *tm); static char *asctime_r (const struct tm *tm, char *buf, int buflen); static char *ctime (const time_t *t); static char *ctime_r (const time_t *clock, char *buf, int buflen); static size_t strftime (char *s, size_t maxsize, const char *format, const struct tm *timeptr); // = A set of wrappers for memory managment. static void *sbrk (int brk); static void *calloc (size_t elements, size_t sizeof_elements); static void *malloc (size_t); static void *realloc (void *, size_t); static void free (void *); // = A set of wrappers for memory copying operations. static int memcmp (const void *t, const void *s, size_t len); static void *memcpy (void *t, const void *s, size_t len); static void *memmove (void *t, const void *s, size_t len); static void *memset (void *s, int c, size_t len); // = A set of wrappers for System V message queues. static int msgctl (int msqid, int cmd, struct msqid_ds *); static int msgget (key_t key, int msgflg); static int msgrcv (int int_id, void *buf, size_t len, long type, int flags); static int msgsnd (int int_id, const void *buf, size_t len, int flags); // = A set of wrappers for memory mapped files. static int madvise (caddr_t addr, size_t len, int advice); static void *mmap (void *addr, size_t len, int prot, int flags, ACE_HANDLE handle, off_t off = 0, ACE_HANDLE *file_mapping = 0); static int mprotect (void *addr, size_t len, int prot); static int msync (void *addr, size_t len, int sync); static int munmap (void *addr, size_t len); // = A set of wrappers for mutex locks. static int mutex_init (ACE_mutex_t *m, int type = USYNC_THREAD, LPCTSTR name = 0, void *arg = 0); static int mutex_destroy (ACE_mutex_t *m); static int mutex_lock (ACE_mutex_t *m); // Win32 note: Abandoned mutexes are not treated differently. 0 is // returned. static int mutex_lock (ACE_mutex_t *m, int &abandoned); // This method is only implemented for Win32. For abandoned // mutexes, <abandoned> is set to 1 and 0 is returned. static int mutex_trylock (ACE_mutex_t *m); static int mutex_unlock (ACE_mutex_t *m); // = A set of wrappers for mutex locks that only work within a // single process. static int thread_mutex_init (ACE_thread_mutex_t *m, int type = USYNC_THREAD, LPCTSTR name = 0, void *arg = 0); static int thread_mutex_destroy (ACE_thread_mutex_t *m); static int thread_mutex_lock (ACE_thread_mutex_t *m); static int thread_mutex_trylock (ACE_thread_mutex_t *m); static int thread_mutex_unlock (ACE_thread_mutex_t *m); // = A set of wrappers for low-level file operations. static int access (const char *path, int amode); static int close (ACE_HANDLE handle); static ACE_HANDLE creat (LPCTSTR filename, mode_t mode); static ACE_HANDLE dup (ACE_HANDLE handle); static int dup2 (ACE_HANDLE oldfd, ACE_HANDLE newfd); static int fattach (int handle, const char *path); static long filesize (ACE_HANDLE handle); static int getmsg (ACE_HANDLE handle, struct strbuf *ctl, struct strbuf *data, int *flags); static int getpmsg (ACE_HANDLE handle, struct strbuf *ctl, struct strbuf *data, int *band, int *flags); static int ioctl (ACE_HANDLE handle, int cmd, void * = 0); static int isastream (ACE_HANDLE handle); static int isatty (ACE_HANDLE handle); static off_t lseek (ACE_HANDLE handle, off_t offset, int whence); static ACE_HANDLE open (const char *filename, int mode, int perms = 0); static int putmsg (ACE_HANDLE handle, const struct strbuf *ctl, const struct strbuf *data, int flags); static int putpmsg (ACE_HANDLE handle, const struct strbuf *ctl, const struct strbuf *data, int band, int flags); static ssize_t read (ACE_HANDLE handle, void *buf, size_t len); static ssize_t read (ACE_HANDLE handle, void *buf, size_t len, ACE_OVERLAPPED *); static ssize_t pread (ACE_HANDLE handle, void *buf, size_t nbyte, off_t offset); static ssize_t readv (ACE_HANDLE handle, struct iovec *iov, int iovlen); static int recvmsg (ACE_HANDLE handle, struct msghdr *msg, int flags); static int sendmsg (ACE_HANDLE handle, const struct msghdr *msg, int flags); static ssize_t write (ACE_HANDLE handle, const void *buf, size_t nbyte); static ssize_t write (ACE_HANDLE handle, const void *buf, size_t nbyte, ACE_OVERLAPPED *); static ssize_t pwrite (ACE_HANDLE handle, const void *buf, size_t nbyte, off_t offset); static int writev (ACE_HANDLE handle, const struct iovec *iov, int iovcnt); // = A set of wrappers for event demultiplexing and IPC. static int select (int width, fd_set *rfds, fd_set *wfds, fd_set *efds, const ACE_Time_Value *tv = 0); static int select (int width, fd_set *rfds, fd_set *wfds, fd_set *efds, const ACE_Time_Value &tv); static int poll (struct pollfd *pollfds, u_long len, ACE_Time_Value *tv = 0); static int poll (struct pollfd *pollfds, u_long len, const ACE_Time_Value &tv); static int pipe (ACE_HANDLE handles[]); // = A set of wrappers for directory operations. static int chdir (const char *path); static int mkdir (const char *path, mode_t mode = ACE_DEFAULT_DIR_PERMS); static int mkfifo (const char *file, mode_t mode = ACE_DEFAULT_FILE_PERMS); static char *mktemp (char *t); static char *getcwd (char *, size_t); static mode_t umask (mode_t cmask); static int unlink (const char *path); static char *tempnam (const char *dir, const char *pfx); // = A set of wrappers for random number operations. static int rand (void); static int rand_r (ACE_RANDR_TYPE seed); static void srand (u_int seed); // = A set of wrappers for readers/writer locks. static int rwlock_init (ACE_rwlock_t *rw, int type = USYNC_THREAD, LPCTSTR name = 0, void *arg = 0); static int rwlock_destroy (ACE_rwlock_t *rw); static int rw_rdlock (ACE_rwlock_t *rw); static int rw_tryrdlock (ACE_rwlock_t *rw); static int rw_trywrlock (ACE_rwlock_t *rw); static int rw_unlock (ACE_rwlock_t *rw); static int rw_wrlock (ACE_rwlock_t *rw); // = A set of wrappers for auto-reset and manuaevents. static int event_init (ACE_event_t *event, int manual_reset = 0, int initial_state = 0, int type = USYNC_THREAD, LPCTSTR name = 0, void *arg = 0); static int event_destroy (ACE_event_t *event); static int event_wait (ACE_event_t *event); static int event_timedwait (ACE_event_t *event, ACE_Time_Value *timeout); static int event_signal (ACE_event_t *event); static int event_pulse (ACE_event_t *event); static int event_reset (ACE_event_t *event); // = A set of wrappers for semaphores. static int sema_destroy (ACE_sema_t *s); static int sema_init (ACE_sema_t *s, u_int count, int type = USYNC_THREAD, LPCTSTR name = 0, void *arg = 0, int max = 0x7fffffff); static int sema_post (ACE_sema_t *s); static int sema_post (ACE_sema_t *s, size_t release_count); static int sema_trywait (ACE_sema_t *s); static int sema_wait (ACE_sema_t *s); static int sema_wait (ACE_sema_t *s, ACE_Time_Value &tv); // = A set of wrappers for System V semaphores. static int semctl (int int_id, int semnum, int cmd, semun); static int semget (key_t key, int nsems, int flags); static int semop (int int_id, struct sembuf *sops, size_t nsops); // = Thread scheduler interface. static int sched_params (const ACE_Sched_Params &); // = A set of wrappers for System V shared memory. static void *shmat (int int_id, void *shmaddr, int shmflg); static int shmctl (int int_id, int cmd, struct shmid_ds *buf); static int shmdt (void *shmaddr); static int shmget (key_t key, int size, int flags); // = A set of wrappers for Signals. static int kill (pid_t pid, int signum); static int sigaction (int signum, const struct sigaction *nsa, struct sigaction *osa); static int sigaddset (sigset_t *s, int signum); static int sigdelset (sigset_t *s, int signum); static int sigemptyset (sigset_t *s); static int sigfillset (sigset_t *s); static int sigismember (sigset_t *s, int signum); static ACE_SignalHandler signal (int signum, ACE_SignalHandler); static int sigprocmask (int how, const sigset_t *nsp, sigset_t *osp); // = A set of wrappers for sockets. static ACE_HANDLE accept (ACE_HANDLE handle, struct sockaddr *addr, int *addrlen); static int bind (ACE_HANDLE s, struct sockaddr *name, int namelen); static int connect (ACE_HANDLE handle, struct sockaddr *addr, int addrlen); static int closesocket (ACE_HANDLE s); static struct passwd *getpwnam (const char *user); static struct passwd *getpwnam_r (const char *name, struct passwd *pwent, char *buffer, int buflen); static struct hostent *gethostbyaddr (const char *addr, int length, int type); static struct hostent *gethostbyname (const char *name); static struct hostent *gethostbyaddr_r (const char *addr, int length, int type, struct hostent *result, ACE_HOSTENT_DATA buffer, int *h_errnop); static struct hostent *gethostbyname_r (const char *name, struct hostent *result, ACE_HOSTENT_DATA buffer, int *h_errnop); static int getpeername (ACE_HANDLE handle, struct sockaddr *addr, int *addrlen); static struct protoent *getprotobyname (const char *name); static struct protoent *getprotobyname_r (const char *name, struct protoent *result, ACE_PROTOENT_DATA buffer); static struct protoent *getprotobynumber (int proto); static struct protoent *getprotobynumber_r (int proto, struct protoent *result, ACE_PROTOENT_DATA buffer); static struct servent *getservbyname (const char *svc, const char *proto); static struct servent *getservbyname_r (const char *svc, const char *proto, struct servent *result, ACE_SERVENT_DATA buf); static int getsockname (ACE_HANDLE handle, struct sockaddr *addr, int *addrlen); static int getsockopt (ACE_HANDLE handle, int level, int optname, char *optval, int *optlen); static long inet_addr (const char *name); static char *inet_ntoa (const struct in_addr addr); static int inet_aton (const char *strptr, struct in_addr *addr); static int listen (ACE_HANDLE handle, int backlog); static int recv (ACE_HANDLE handle, char *buf, int len, int flags = 0); static int recvfrom (ACE_HANDLE handle, char *buf, int len, int flags, struct sockaddr *addr, int *addrlen); static int send (ACE_HANDLE handle, const char *buf, int len, int flags = 0); static int sendto (ACE_HANDLE handle, const char *buf, int len, int flags, const struct sockaddr *addr, int addrlen); static int setsockopt (ACE_HANDLE handle, int level, int optname, const char *optval, int optlen); static int shutdown (ACE_HANDLE handle, int how); static ACE_HANDLE socket (int domain, int type, int proto); static int socketpair (int domain, int type, int protocol, ACE_HANDLE sv[2]); static int socket_init (int version_high = 1, int version_low = 1); // Initialize WinSock before first use (e.g., when a DLL is first // loaded or the first use of a socket() call. static int socket_fini (void); // Finalize WinSock after last use (e.g., when a DLL is unloaded). // = A set of wrappers for regular expressions. static char *compile (const char *instring, char *expbuf, char *endbuf); static int step (const char *str, char *expbuf); // = A set of wrappers for non-UNICODE string operations. static int strcasecmp (const char *s, const char *t); static char *strcat (char *s, const char *t); static char *strchr (const char *s, int c); static char *strrchr (const char *s, int c); static int strcmp (const char *s, const char *t); static char *strcpy (char *s, const char *t); static size_t strspn(const char *s1, const char *s2); static char *strstr (const char *s, const char *t); static char *strdup (const char *s); static size_t strlen (const char *s); static int strncmp (const char *s, const char *t, size_t len); static char *strncpy (char *s, const char *t, size_t len); static char *strncat (char *s, const char *t, size_t len); static char *strtok (char *s, const char *tokens); static char *strtok_r (char *s, const char *tokens, char **lasts); static long strtol (const char *s, char **ptr, int base); #if defined (ACE_HAS_UNICODE) // = A set of wrappers for UNICODE string operations. static wchar_t *strcat (wchar_t *s, const wchar_t *t); static wchar_t *strchr (const wchar_t *s, wint_t c); static wchar_t *strrchr (const wchar_t *s, wint_t c); static int strcmp (const wchar_t *s, const wchar_t *t); static wchar_t *strcpy (wchar_t *s, const wchar_t *t); static size_t strlen (const wchar_t *s); static int strncmp (const wchar_t *s, const wchar_t *t, size_t len); static wchar_t *strncpy (wchar_t *s, const wchar_t *t, size_t len); static wchar_t *strncat (wchar_t *s, const wchar_t *t, size_t len); static wchar_t *strtok (wchar_t *s, const wchar_t *tokens); static long strtol (const wchar_t *s, wchar_t **ptr, int base); //static int isspace (wint_t c); #if defined (ACE_WIN32) static wchar_t *strstr (const wchar_t *s, const wchar_t *t); static wchar_t *strdup (const wchar_t *s); static int sprintf (wchar_t *buf, const wchar_t *format, ...); static int sprintf (wchar_t *buf, const char *format, ...); static int vsprintf (wchar_t *buffer, const wchar_t *format, va_list argptr); static int access (const wchar_t *path, int amode); static FILE *fopen (const wchar_t *filename, const wchar_t *mode); static int stat (const wchar_t *file, struct stat *); static wchar_t *getenv (const wchar_t *symbol); static int system (const wchar_t *s); static int hostname (wchar_t *name, size_t maxnamelen); static ACE_HANDLE open (const wchar_t *filename, int mode, int perms = 0); static int unlink (const wchar_t *path); static ACE_SHLIB_HANDLE dlopen (ACE_WIDE_DL_TYPE filename, int mode = ACE_DEFAULT_SHLIB_MODE); static wchar_t *mktemp (wchar_t *t); static int mkdir (const wchar_t *path, mode_t mode = ACE_DEFAULT_DIR_PERMS); static int chdir (const wchar_t *path); #endif /* ACE_WIN32 */ #endif /* ACE_HAS_UNICODE */ // = A set of wrappers for TLI. static int t_accept (ACE_HANDLE fildes, int resfd, struct t_call *call); static char *t_alloc (ACE_HANDLE fildes, int struct_type, int fields); static int t_bind (ACE_HANDLE fildes, struct t_bind *req, struct t_bind *ret); static int t_close (ACE_HANDLE fildes); static int t_connect(int fildes, struct t_call *sndcall, struct t_call *rcvcall); static void t_error (char *errmsg); static int t_free (char *ptr, int struct_type); static int t_getinfo (ACE_HANDLE fildes, struct t_info *info); static int t_getname (ACE_HANDLE fildes, struct netbuf *namep, int type); static int t_getstate (ACE_HANDLE fildes); static int t_listen (ACE_HANDLE fildes, struct t_call *call); static int t_look (ACE_HANDLE fildes); static int t_open (char *path, int oflag, struct t_info *info); static int t_optmgmt (ACE_HANDLE fildes, struct t_optmgmt *req, struct t_optmgmt *ret); static int t_rcv (ACE_HANDLE fildes, char *buf, u_int nbytes, int *flags); static int t_rcvdis (ACE_HANDLE fildes, struct t_discon *discon); static int t_rcvrel (ACE_HANDLE fildes); static int t_rcvudata (ACE_HANDLE fildes, struct t_unitdata *unitdata, int *flags); static int t_rcvuderr (ACE_HANDLE fildes, struct t_uderr *uderr); static int t_snd (ACE_HANDLE fildes, char *buf, u_int nbytes, int flags); static int t_snddis (ACE_HANDLE fildes, struct t_call *call); static int t_sndrel (ACE_HANDLE fildes); static int t_sync (ACE_HANDLE fildes); static int t_unbind (ACE_HANDLE fildes); #if 0 // = A set of wrappers for threads (these are portable since they use the ACE_Thread_ID). static int thr_continue (const ACE_Thread_ID &thread); static int thr_create (ACE_THR_FUNC, void *args, long flags, ACE_Thread_ID *, long priority = ACE_DEFAULT_THREAD_PRIORITY, void *stack = 0, size_t stacksize = 0); static int thr_getprio (ACE_Thread_ID thr_id, int &prio, int *policy = 0); static int thr_join (ACE_Thread_ID waiter_id, void **status); static int thr_kill (ACE_Thread_ID thr_id, int signum); static ACE_Thread_ID thr_self (void); static int thr_setprio (ACE_Thread_ID thr_id, int prio); static int thr_setprio (const ACE_Sched_Priority prio); static int thr_suspend (ACE_Thread_ID target_thread); static int thr_cancel (ACE_Thread_ID t_id); #endif /* 0 */ // = A set of wrappers for threads (these are non-portable since they use ACE_thread_t and ACE_hthread_t and will go away in a future release). static int thr_continue (ACE_hthread_t target_thread); static int thr_create (ACE_THR_FUNC, void *args, long flags, ACE_thread_t *thr_id, ACE_hthread_t *t_handle = 0, long priority = ACE_DEFAULT_THREAD_PRIORITY, void *stack = 0, size_t stacksize = 0); // Creates a new thread having <{flags}> attributes and running <{ACE_THR_FUNC}> // with <{args}>. <{thr_id}> and <{t_handle}> are set to the thread's ID and handle (?), // respectively. The thread runs at <{priority}> priority (see below). // // The <{flags}> are a bitwise-OR of the following: // = BEGIN<INDENT> // THR_CANCEL_DISABLE, THR_CANCEL_ENABLE, THR_CANCEL_DEFERRED, THR_CANCEL_ASYNCHRONOUS, // THR_BOUND, THR_NEW_LWP, THR_DETACHED, THR_SUSPENDED, THR_DAEMON, THR_JOINABLE, // THR_SCHED_FIFO, THR_SCHED_RR, THR_SCHED_DEFAULT // = END<INDENT> // // By default, or if <{priority}> is set to ACE_DEFAULT_THREAD_PRIORITY, // an "appropriate" // priority value for the given scheduling policy (specified in // <{flags}>, e.g., <THR_SCHED_DEFAULT>) is used. This value is // calculated dynamically, and is the median value between the // minimum and maximum priority values for the given policy. If an // explicit value is given, it is used. Note that actual priority // values are EXTREMEMLY implementation-dependent, and are probably // best avoided. static int thr_getprio (ACE_hthread_t thr_id, int &prio); static int thr_join (ACE_hthread_t waiter_id, void **status); static int thr_join (ACE_thread_t waiter_id, ACE_thread_t *thr_id, void **status); static int thr_kill (ACE_thread_t thr_id, int signum); static ACE_thread_t thr_self (void); static void thr_self (ACE_hthread_t &); static int thr_setprio (ACE_hthread_t thr_id, int prio); static int thr_setprio (const ACE_Sched_Priority prio); static int thr_suspend (ACE_hthread_t target_thread); static int thr_cancel (ACE_thread_t t_id); static int thr_cmp (ACE_hthread_t t1, ACE_hthread_t t2); static int thr_equal (ACE_thread_t t1, ACE_thread_t t2); static void thr_exit (void *status = 0); static int thr_getconcurrency (void); static int thr_getspecific (ACE_thread_key_t key, void **data); static int thr_keyfree (ACE_thread_key_t key); static int thr_key_detach (void *inst); #if defined (ACE_HAS_THR_C_DEST) static int thr_keycreate (ACE_thread_key_t *key, ACE_THR_C_DEST, void *inst = 0); #else static int thr_keycreate (ACE_thread_key_t *key, ACE_THR_DEST, void *inst = 0); #endif /* ACE_HAS_THR_C_DEST */ static int thr_key_used (ACE_thread_key_t key); static size_t thr_min_stack (void); static int thr_setconcurrency (int hint); static int thr_setspecific (ACE_thread_key_t key, void *data); static int thr_sigsetmask (int how, const sigset_t *nsm, sigset_t *osm); static int thr_setcancelstate (int new_state, int *old_state); static int thr_setcanceltype (int new_type, int *old_type); static int sigwait (sigset_t *set, int *sig = 0); static void thr_testcancel (void); static void thr_yield (void); static ACE_thread_t NULL_thread; // This is necessary to deal with POSIX pthreads and their use of // structures for thread ids. static ACE_hthread_t NULL_hthread; // This is necessary to deal with POSIX pthreads and their use of // structures for thread handles. static ACE_thread_key_t NULL_key; // This is necessary to deal with POSIX pthreads and their use of // structures for TSS keys. #if defined (ACE_WIN32) static int socket_initialized_; // Keeps track of whether we've already initialized WinSock... #endif /* ACE_WIN32 */ static void mutex_lock_cleanup (void *mutex); // Handle asynchronous thread cancellation cleanup. private: ACE_OS (void); // Ensure we can't define an instance of this class. #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0) && defined (ACE_LACKS_NETDB_REENTRANT_FUNCTIONS) static int netdb_acquire (void); static int netdb_release (void); #endif /* defined (ACE_MT_SAFE) && ACE_LACKS_NETDB_REENTRANT_FUNCTIONS */ }; #if defined (ACE_LACKS_TIMEDWAIT_PROTOTYPES) extern "C" ssize_t send_timedwait (ACE_HANDLE handle, const char *buf, int len, int flags, struct timespec *timeout); extern "C" ssize_t recv_timedwait (ACE_HANDLE handle, char *buf, int len, int flags, struct timespec *timeout); extern "C" ssize_t recvfrom_timedwait (ACE_HANDLE handle, char *buf, int len, int flags, struct sockaddr *addr, int *addrlen, struct timespec *timeout); extern "C" ssize_t recvmsg_timedwait (ACE_HANDLE handle, struct msghdr *msg, int flags, struct timespec *timeout); extern "C" ssize_t read_timedwait (ACE_HANDLE handle, void *buf, size_t len, struct timespec *timeout); extern "C" ssize_t readv_timedwait (ACE_HANDLE handle, struct iovec *iov, int iovcnt, struct timespec* timeout); extern "C" ssize_t sendto_timedwait (ACE_HANDLE handle, const char *buf, int len, int flags, const struct sockaddr *addr, int addrlen, struct timespec *timeout); extern "C" sszie_t sendmsg_timedwait (ACE_HANDLE handle, ACE_SENDMSG_TYPE *msg, int flags, struct timespec *timeout); extern "C" ssize_t write_timedwait (ACE_HANDLE handle, const void *buf, size_t n, struct timespec *timeout); extern "C" ssize_t writev_timedwait (ACE_HANDLE handle, ACE_WRITEV_TYPE *iov, int iovcnt, struct timespec *timeout); #endif /* ACE_LACKS_TIMEDWAIT_PROTOTYPES */ // A useful abstraction for expressions involving operator new since // we can change memory allocation error handling policies (e.g., // depending on whether ANSI/ISO exception handling semantics are // being used). #define ACE_NEW_RETURN(POINTER,CONSTRUCTOR,RET_VAL) \ do { POINTER = new CONSTRUCTOR; \ if (POINTER == 0) { errno = ENOMEM; return RET_VAL; } \ } while (0) #define ACE_NEW(POINTER,CONSTRUCTOR) \ do { POINTER = new CONSTRUCTOR; \ if (POINTER == 0) { errno = ENOMEM; return; } \ } while (0) #define ACE_ALLOCATOR_RETURN(POINTER,ALLOCATOR,RET_VAL) \ do { POINTER = ALLOCATOR; \ if (POINTER == 0) { errno = ENOMEM; return RET_VAL; } \ } while (0) #define ACE_ALLOCATOR(POINTER,ALLOCATOR) \ do { POINTER = ALLOCATOR; \ if (POINTER == 0) { errno = ENOMEM; return; } \ } while (0) // Some more useful abstration for expressions involving // ACE_Allocator.malloc (). The difference between these macro with // ACE_ALLOCATOR is that we provide construction also. #define ACE_NEW_MALLOC_RETURN(POINTER,ALLOCATOR,CONSTRUCTOR,RET_VAL) \ do { POINTER = ALLOCATOR; \ if (POINTER == 0) { errno = ENOMEM; return RET_VAL;} \ else { new (POINTER) CONSTRUCTOR; } \ } while (0) #define ACE_NEW_MALLOC(POINTER,ALLOCATOR,CONSTRUCTOR) \ do { POINTER = ALLOCATOR; \ if (POINTER == 0) { errno = ENOMEM; return;} \ else { new (POINTER) CONSTRUCTOR; } \ } while (0) #if defined (ACE_HAS_SIGNAL_SAFE_OS_CALLS) // The following two macros ensure that system calls are properly // restarted (if necessary) when interrupts occur. #define ACE_OSCALL(OP,TYPE,FAILVALUE,RESULT) \ do \ RESULT = (TYPE) OP; \ while (RESULT == FAILVALUE && errno == EINTR && ACE_LOG_MSG->restart ()) #define ACE_OSCALL_RETURN(OP,TYPE,FAILVALUE) \ do { \ TYPE ace_result_; \ do \ ace_result_ = (TYPE) OP; \ while (ace_result_ == FAILVALUE && errno == EINTR && ACE_LOG_MSG->restart ()); \ return ace_result_; \ } while (0) #elif defined (ACE_WIN32) #define ACE_OSCALL_RETURN(X,TYPE,FAILVALUE) \ do { \ TYPE ace_result_ = (TYPE) X; \ if (ace_result_ == FAILVALUE) \ errno = ::GetLastError (); \ return ace_result_; \ } while (0) #define ACE_OSCALL(X,TYPE,FAILVALUE,RESULT) \ do { \ RESULT = (TYPE) X; \ if (RESULT == FAILVALUE) \ errno = ::GetLastError (); \ } while (0) #else #define ACE_OSCALL_RETURN(OP,TYPE,FAILVALUE) do { TYPE ace_result_ = FAILVALUE; ace_result_ = ace_result_; return OP; } while (0) #define ACE_OSCALL(OP,TYPE,FAILVALUE,RESULT) do { RESULT = (TYPE) OP; } while (0) #endif /* ACE_HAS_SIGNAL_SAFE_OS_CALLS */ #if !defined (ACE_DEFAULT_MUTEX_A) #define ACE_DEFAULT_MUTEX_A "ACE_MUTEX" #endif /* ACE_DEFAULT_MUTEX_A */ #if defined (UNICODE) #if !defined (ACE_DEFAULT_NAMESPACE_DIR) #define ACE_DEFAULT_NAMESPACE_DIR ACE_DEFAULT_NAMESPACE_DIR_W #endif /* ACE_DEFAULT_NAMESPACE_DIR */ #if !defined (ACE_DEFAULT_LOCALNAME) #define ACE_DEFAULT_LOCALNAME ACE_DEFAULT_LOCALNAME_W #endif /* ACE_DEFAULT_LOCALNAME */ #if !defined (ACE_DEFAULT_GLOBALNAME) #define ACE_DEFAULT_GLOBALNAME ACE_DEFAULT_GLOBALNAME_W #endif /* ACE_DEFAULT_GLOBALNAME */ #if !defined (ACE_DIRECTORY_SEPARATOR_STR) #define ACE_DIRECTORY_SEPARATOR_STR ACE_DIRECTORY_SEPARATOR_STR_W #endif /* ACE_DIRECTORY_SEPARATOR_STR */ #if !defined (ACE_DIRECTORY_SEPARATOR_CHAR) #define ACE_DIRECTORY_SEPARATOR_CHAR ACE_DIRECTORY_SEPARATOR_CHAR_W #endif /* ACE_DIRECTORY_SEPARATOR_CHAR */ #if !defined (ACE_PLATFORM) #define ACE_PLATFORM ACE_PLATFORM_W #endif /* ACE_PLATFORM */ #if !defined (ACE_PLATFORM_EXE_SUFFIX) #define ACE_PLATFORM_EXE_SUFFIX ACE_PLATFORM_EXE_SUFFIX_W #endif /* ACE_PLATFORM_EXE_SUFFIX */ #if !defined (ACE_DEFAULT_MUTEX_W) #define ACE_DEFAULT_MUTEX_W L"ACE_MUTEX" #endif /* ACE_DEFAULT_MUTEX_W */ #if !defined (ACE_DEFAULT_MUTEX) #define ACE_DEFAULT_MUTEX ACE_DEFAULT_MUTEX_W #endif /* ACE_DEFAULT_MUTEX */ #else #if !defined (ACE_DEFAULT_NAMESPACE_DIR) #define ACE_DEFAULT_NAMESPACE_DIR ACE_DEFAULT_NAMESPACE_DIR_A #endif /* ACE_DEFAULT_NAMESPACE_DIR */ #if !defined (ACE_DEFAULT_LOCALNAME) #define ACE_DEFAULT_LOCALNAME ACE_DEFAULT_LOCALNAME_A #endif /* ACE_DEFAULT_LOCALNAME */ #if !defined (ACE_DEFAULT_GLOBALNAME) #define ACE_DEFAULT_GLOBALNAME ACE_DEFAULT_GLOBALNAME_A #endif /* ACE_DEFAULT_GLOBALNAME */ #if !defined (ACE_DIRECTORY_SEPARATOR_STR) #define ACE_DIRECTORY_SEPARATOR_STR ACE_DIRECTORY_SEPARATOR_STR_A #endif /* ACE_DIRECTORY_SEPARATOR_STR */ #if !defined (ACE_DIRECTORY_SEPARATOR_CHAR) #define ACE_DIRECTORY_SEPARATOR_CHAR ACE_DIRECTORY_SEPARATOR_CHAR_A #endif /* ACE_DIRECTORY_SEPARATOR_CHAR */ #if !defined (ACE_PLATFORM) #define ACE_PLATFORM ACE_PLATFORM_A #endif /* ACE_PLATFORM */ #if !defined (ACE_PLATFORM_EXE_SUFFIX) #define ACE_PLATFORM_EXE_SUFFIX ACE_PLATFORM_EXE_SUFFIX_A #endif /* ACE_PLATFORM_EXE_SUFFIX */ #if !defined (ACE_DEFAULT_MUTEX_W) #define ACE_DEFAULT_MUTEX_W "ACE_MUTEX" #endif /* ACE_DEFAULT_MUTEX_W */ #if !defined (ACE_DEFAULT_MUTEX) #define ACE_DEFAULT_MUTEX ACE_DEFAULT_MUTEX_A #endif /* ACE_DEFAULT_MUTEX */ #endif /* UNICODE */ #if defined (ACE_HAS_INLINED_OSCALLS) #if defined (ACE_INLINE) #undef ACE_INLINE #endif /* ACE_INLINE */ #define ACE_INLINE inline #include "ace/OS.i" #endif /* ACE_HAS_INLINED_OSCALLS */ #include "ace/Trace.h" // These need to come here to avoid problems with circular dependencies. #include "ace/Log_Msg.h" // The following are some insane macros that are useful in cases when // one has to have a string in a certain format. Both of these macros // allow the user to create a temporary copy. If the user needs to // keep this temporary string around, they must do some sort of strdup // on the temporary string. // // The ACE_WIDE_STRING macro allows the user to create a temporary // representation of an ASCII string as a WIDE string. // // The ACE_MULTIBYTE_STRING macro allows the user to create a // temporary representation of a WIDE string as an ASCII string. Note // that some data may be lost in this conversion. #if defined (UNICODE) #include "ace/Auto_Ptr.h" #include "ace/SString.h" #define ACE_WIDE_STRING(ASCII_STRING) \ ACE_WString (ASCII_STRING).fast_rep () #define ACE_MULTIBYTE_STRING(WIDE_STRING) \ auto_basic_array_ptr<char> (ACE_WString (WIDE_STRING).char_rep ()).get () #define ACE_TEXT_STRING ACE_WString #else #define ACE_WIDE_STRING(ASCII_STRING) ASCII_STRING #define ACE_MULTIBYTE_STRING(WIDE_STRING) WIDE_STRING #define ACE_TEXT_STRING ACE_CString #endif /* UNICODE */ #endif /* ACE_OS_H */