diff options
author | Steve Huston <shuston@riverace.com> | 1997-06-25 01:53:04 +0000 |
---|---|---|
committer | Steve Huston <shuston@riverace.com> | 1997-06-25 01:53:04 +0000 |
commit | 618fc98fdc023c83fa7f684de0ef8d6ddb03f657 (patch) | |
tree | dd4e33f7f64a760c68d0e1816bb058e11a771f00 /ace/OS.h | |
parent | 21aab4d993e43a7754b7e13a7fd66f0f10e64870 (diff) | |
download | ATCD-618fc98fdc023c83fa7f684de0ef8d6ddb03f657.tar.gz |
Added a ACE_SHLIB_HANDLE typedef to mask the differences between shared
library handles on different platforms. Also a default 'mode' for loading a
shared library.
Moved the ACE_OSCALL_* macros from OS.i into this file.
Diffstat (limited to 'ace/OS.h')
-rw-r--r-- | ace/OS.h | 47 |
1 files changed, 43 insertions, 4 deletions
@@ -2185,8 +2185,25 @@ extern "C" int sigwait (sigset_t *set); #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; +const int ACE_DEFAULT_SHLIB_MODE = RTLD_LAZY; +#elif defined (ACE_WIN32) +typedef HINSTANCE ACE_SHLIB_HANDLE; +const int ACE_DEFAULT_SHLIB_MODE = 0; +#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; #endif /* ACE_HAS_SVR4_DYNAMIC_LINKING */ #if defined (ACE_HAS_SOCKIO_H) @@ -2855,10 +2872,11 @@ public: static int hostname (char *name, size_t maxnamelen); // = A set of wrappers for explicit dynamic linking. - static int dlclose (void *handle); + static int dlclose (ACE_SHLIB_HANDLE handle); static char *dlerror (void); - static void *dlopen (ACE_DL_TYPE filename, int mode); - static void *dlsym (void *handle, ACE_DL_TYPE symbol); + 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); @@ -3255,7 +3273,8 @@ public: 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 void *dlopen (ACE_WIDE_DL_TYPE filename, int mode); + 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); @@ -3435,6 +3454,26 @@ private: if (POINTER == 0) { errno = ENOMEM; return; } \ } 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) +#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 */ |