Fixes to support FreeBSD and Darwin.

This commit is contained in:
crs 2003-01-11 21:06:21 +00:00
parent 4bf0836eae
commit a14a462e22
8 changed files with 74 additions and 23 deletions

View File

@ -480,6 +480,17 @@ if test "x$acx_pthread_ok" = xyes; then
fi fi
fi fi
# Detect pthread signal functions
AC_MSG_CHECKING([for pthread signal functions])
AC_TRY_LINK([#include <pthread.h>
#include <signal.h>],
[pthread_kill(pthread_self(), SIGTERM);],
ok=yes, ok=unknown)
AC_MSG_RESULT(${ok})
if test x"$ok" != xno; then
AC_DEFINE(HAVE_PTHREAD_SIGNAL,1,[Define if you have \`pthread_sigmask\' and \`pthread_kill\' functions.])
fi
LIBS="$save_LIBS" LIBS="$save_LIBS"
CXXFLAGS="$save_CXXFLAGS" CXXFLAGS="$save_CXXFLAGS"

View File

@ -48,7 +48,7 @@ ACX_CHECK_INET_ATON
dnl checks for header files dnl checks for header files
AC_HEADER_STDC AC_HEADER_STDC
AC_CHECK_HEADERS([unistd.h sys/time.h sys/types.h]) AC_CHECK_HEADERS([unistd.h sys/time.h sys/types.h wchar.h])
AC_CHECK_HEADERS([sys/socket.h sys/select.h]) AC_CHECK_HEADERS([sys/socket.h sys/select.h])
AC_CHECK_HEADERS([istream ostream sstream]) AC_CHECK_HEADERS([istream ostream sstream])
AC_HEADER_TIME AC_HEADER_TIME

View File

@ -30,6 +30,17 @@
#define SIGWAKEUP SIGUSR1 #define SIGWAKEUP SIGUSR1
#if !HAVE_PTHREAD_SIGNAL
// boy, is this platform broken. forget about pthread signal
// handling and let signals through to every process. synergy
// will not terminate cleanly when it gets SIGTERM or SIGINT.
# define pthread_sigmask sigprocmask
# define pthread_kill(tid_, sig_) kill(0, (sig_))
# define sigwait(set_, sig_)
# undef HAVE_POSIX_SIGWAIT
# define HAVE_POSIX_SIGWAIT 1
#endif
// //
// CArchThreadImpl // CArchThreadImpl
// //
@ -318,7 +329,9 @@ CArchMultithreadPosix::newThread(ThreadFunc func, void* data)
// can't tell the difference. // can't tell the difference.
if (!m_newThreadCalled) { if (!m_newThreadCalled) {
m_newThreadCalled = true; m_newThreadCalled = true;
#if HAVE_PTHREAD_SIGNAL
startSignalHandler(); startSignalHandler();
#endif
} }
lockMutex(m_threadMutex); lockMutex(m_threadMutex);

View File

@ -327,7 +327,7 @@ CArchNetworkBSD::pollSocket(CPollEntry pe[], int num, double timeout)
#else #else
void int
CArchNetworkBSD::pollSocket(CPollEntry pe[], int num, double timeout) CArchNetworkBSD::pollSocket(CPollEntry pe[], int num, double timeout)
{ {
int i, n; int i, n;
@ -765,8 +765,10 @@ CArchNetworkBSD::throwError(int err)
case ENODEV: case ENODEV:
case ENOBUFS: case ENOBUFS:
case ENOMEM: case ENOMEM:
case ENOSR:
case ENETDOWN: case ENETDOWN:
#if defined(ENOSR)
case ENOSR:
#endif
throw XArchNetworkResource(new XArchEvalUnix(err)); throw XArchNetworkResource(new XArchEvalUnix(err));
case EPROTOTYPE: case EPROTOTYPE:
@ -777,8 +779,10 @@ CArchNetworkBSD::throwError(int err)
case EINVAL: case EINVAL:
case ENOPROTOOPT: case ENOPROTOOPT:
case EOPNOTSUPP: case EOPNOTSUPP:
case ENOPKG:
case ESHUTDOWN: case ESHUTDOWN:
#if defined(ENOPKG)
case ENOPKG:
#endif
throw XArchNetworkSupport(new XArchEvalUnix(err)); throw XArchNetworkSupport(new XArchEvalUnix(err));
case EIO: case EIO:

View File

@ -22,15 +22,8 @@
#endif #endif
#if !defined(HAVE_SOCKLEN_T) #if !defined(HAVE_SOCKLEN_T)
// Darwin is so unsure what to use for socklen_t it makes us choose
# if defined(__APPLE__)
# if !defined(_BSD_SOCKLEN_T_)
# define _BSD_SOCKLEN_T_ int
# endif
# else
typedef int socklen_t; typedef int socklen_t;
#endif #endif
#endif
#define ARCH_NETWORK CArchNetworkBSD #define ARCH_NETWORK CArchNetworkBSD

View File

@ -69,7 +69,7 @@ CArchSleepUnix::sleep(double timeout)
ARCH->testCancelThread(); ARCH->testCancelThread();
#else #else
/* emulate nanosleep() with select() */ /* emulate nanosleep() with select() */
double startTime = time(); double startTime = ARCH->time();
double timeLeft = timeout; double timeLeft = timeout;
while (timeLeft > 0.0) { while (timeLeft > 0.0) {
struct timeval timeout2; struct timeval timeout2;
@ -82,7 +82,7 @@ CArchSleepUnix::sleep(double timeout)
SELECT_TYPE_ARG234 NULL, SELECT_TYPE_ARG234 NULL,
SELECT_TYPE_ARG5 &timeout2); SELECT_TYPE_ARG5 &timeout2);
ARCH->testCancelThread(); ARCH->testCancelThread();
timeLeft = timeout - (time() - startTime); timeLeft = timeout - (ARCH->time() - startTime);
} }
#endif #endif
} }

View File

@ -14,11 +14,42 @@
#include "CArch.h" #include "CArch.h"
#include <string.h> #include <string.h>
#include <cwchar> #if HAVE_WCHAR_H
# include <wchar.h>
#elif __APPLE__
// wtf? Darwin puts mbtowc() et al. in stdlib
# include <stdlib.h>
#else
// platform apparently has no wchar_t support. provide dummy
// implementations. hopefully at least the C++ compiler has
// a built-in wchar_t type.
# undef HAVE_MBSINIT
static inline
int
mbtowc(wchar_t* dst, const char* src, int n)
{
*dst = static_cast<wchar_t>(*src);
return 1;
}
static inline
int
wctomb(char* dst, wchar_t src)
{
*dst = static_cast<char>(src);
return 1;
}
#endif
class CArchMBStateImpl { class CArchMBStateImpl {
public: public:
#if HAVE_MBSINIT
mbstate_t m_mbstate; mbstate_t m_mbstate;
#else
int m_mbstate; // dummy data
#endif
}; };
// //
@ -50,7 +81,9 @@ ARCH_STRING::initMBState(CArchMBState state)
bool bool
ARCH_STRING::isInitMBState(CArchMBState state) ARCH_STRING::isInitMBState(CArchMBState state)
{ {
#if !HAVE_MBSINIT // if we're using this file mbsinit() probably doesn't exist
// but use it if it does
#if HAVE_MBSINIT
return (mbsinit(&state->m_mbstate) != 0); return (mbsinit(&state->m_mbstate) != 0);
#else #else
return true; return true;

View File

@ -17,14 +17,6 @@ VDEPTH = ./$(VPATH)/$(DEPTH)
EXTRA_DIST = \ EXTRA_DIST = \
common.dsp \ common.dsp \
$(NULL)
MAINTAINERCLEANFILES = \
Makefile.in \
$(NULL)
noinst_LIBRARIES = libcommon.a
libcommon_a_SOURCES = \
BasicTypes.h \ BasicTypes.h \
IInterface.h \ IInterface.h \
Version.h \ Version.h \
@ -41,5 +33,10 @@ libcommon_a_SOURCES = \
stdstring.h \ stdstring.h \
stdvector.h \ stdvector.h \
$(NULL) $(NULL)
MAINTAINERCLEANFILES = \
Makefile.in \
$(NULL)
INCLUDES = \ INCLUDES = \
$(NULL) $(NULL)