diff options
author | Ted Ross <tross@apache.org> | 2011-05-18 02:14:07 +0000 |
---|---|---|
committer | Ted Ross <tross@apache.org> | 2011-05-18 02:14:07 +0000 |
commit | 0bab2f6cf49bbfc2db1089fc25d339315e92f2c1 (patch) | |
tree | 7dbac72712fcf450c394b116ed25ac13c863a802 | |
parent | ecf0094069b8436259d0d723ce80700337a1b424 (diff) | |
download | qpid-python-0bab2f6cf49bbfc2db1089fc25d339315e92f2c1.tar.gz |
QPID-2905 - Code modifications to enable Windows builds with the mingw32 compiler.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1104662 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | qpid/cpp/include/qpid/sys/Thread.h | 6 | ||||
-rwxr-xr-x | qpid/cpp/include/qpid/sys/windows/IntegerTypes.h | 6 | ||||
-rw-r--r-- | qpid/cpp/src/CMakeLists.txt | 7 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/broker/windows/BrokerDefaults.cpp | 6 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/sys/alloca.h | 29 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp | 10 | ||||
-rwxr-xr-x | qpid/cpp/src/qpid/sys/windows/Socket.cpp | 5 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/sys/windows/SocketAddress.cpp | 5 | ||||
-rwxr-xr-x | qpid/cpp/src/qpid/sys/windows/StrError.cpp | 7 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/sys/windows/Time.cpp | 4 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/sys/windows/mingw32_compat.h | 39 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/sys/windows/uuid.cpp | 6 | ||||
-rw-r--r-- | qpid/cpp/src/tests/TimerTest.cpp | 4 | ||||
-rw-r--r-- | qpid/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp | 4 |
14 files changed, 112 insertions, 26 deletions
diff --git a/qpid/cpp/include/qpid/sys/Thread.h b/qpid/cpp/include/qpid/sys/Thread.h index 45a39e796f..f556612908 100644 --- a/qpid/cpp/include/qpid/sys/Thread.h +++ b/qpid/cpp/include/qpid/sys/Thread.h @@ -25,7 +25,11 @@ #include "qpid/CommonImportExport.h" #ifdef _WIN32 -# define QPID_TSS __declspec(thread) +# ifdef _MSC_VER +# define QPID_TSS __declspec(thread) +# else +# define QPID_TSS __thread +# endif #elif defined (__GNUC__) # define QPID_TSS __thread #elif defined (__SUNPRO_CC) diff --git a/qpid/cpp/include/qpid/sys/windows/IntegerTypes.h b/qpid/cpp/include/qpid/sys/windows/IntegerTypes.h index ece1a618e9..fff320bc96 100755 --- a/qpid/cpp/include/qpid/sys/windows/IntegerTypes.h +++ b/qpid/cpp/include/qpid/sys/windows/IntegerTypes.h @@ -22,13 +22,17 @@ */ typedef unsigned char uint8_t; -typedef char int8_t; typedef unsigned short uint16_t; typedef short int16_t; typedef unsigned int uint32_t; typedef int int32_t; +#if defined(_MSC_VER) +typedef char int8_t; typedef unsigned __int64 uint64_t; typedef __int64 int64_t; +#else +#include <stdint.h> +#endif // Visual Studio doesn't define other common types, so set them up here too. typedef unsigned int uint; diff --git a/qpid/cpp/src/CMakeLists.txt b/qpid/cpp/src/CMakeLists.txt index d0ca2d9c2b..0fe2d7e4d0 100644 --- a/qpid/cpp/src/CMakeLists.txt +++ b/qpid/cpp/src/CMakeLists.txt @@ -636,8 +636,7 @@ if (CMAKE_SYSTEM_NAME STREQUAL Windows) ) set (qpidcommon_platform_LIBS - ${windows_ssl_libs} ws2_32 - ) + ${Boost_THREAD_LIBRARY} ${windows_ssl_libs} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_DATE_TIME_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ws2_32 ) set (qpidbroker_platform_SOURCES qpid/broker/windows/BrokerDefaults.cpp qpid/broker/windows/SaslAuthenticator.cpp @@ -938,7 +937,7 @@ if (NOT QPID_GENERATED_HEADERS_IN_SOURCE) endif (NOT QPID_GENERATED_HEADERS_IN_SOURCE) -if (WIN32) +if (_MSC_VER) # Install the DtcPlugin project and call it qpidxarm. set(AMQP_WCF_DIR ${qpid-cpp_SOURCE_DIR}/../wcf) set(qpidxarm_SOURCES ${AMQP_WCF_DIR}/src/Apache/Qpid/DtcPlugin/DtcPlugin.cpp) @@ -951,7 +950,7 @@ if (WIN32) COMPONENT ${QPID_COMPONENT_CLIENT}) install_pdb (qpidxarm ${QPID_COMPONENT_CLIENT}) endif (EXISTS ${qpidxarm_SOURCES}) -endif (WIN32) +endif (_MSC_VER) set (qpidbroker_SOURCES ${mgen_broker_cpp} diff --git a/qpid/cpp/src/qpid/broker/windows/BrokerDefaults.cpp b/qpid/cpp/src/qpid/broker/windows/BrokerDefaults.cpp index b6862f0418..b65440b5ad 100644 --- a/qpid/cpp/src/qpid/broker/windows/BrokerDefaults.cpp +++ b/qpid/cpp/src/qpid/broker/windows/BrokerDefaults.cpp @@ -31,10 +31,16 @@ const std::string Broker::Options::DEFAULT_DATA_DIR_NAME("\\QPIDD.DATA"); std::string Broker::Options::getHome() { std::string home; +#ifdef _MSC_VER char home_c[MAX_PATH+1]; size_t unused; if (0 == getenv_s (&unused, home_c, sizeof(home_c), "HOME")) home += home_c; +#else + char *home_c = getenv("HOME"); + if (home_c) + home += home_c; +#endif return home; } diff --git a/qpid/cpp/src/qpid/sys/alloca.h b/qpid/cpp/src/qpid/sys/alloca.h index e989670e4f..0f58920908 100644 --- a/qpid/cpp/src/qpid/sys/alloca.h +++ b/qpid/cpp/src/qpid/sys/alloca.h @@ -21,19 +21,22 @@ * */ -#if (defined(_WINDOWS) || defined (WIN32)) && defined(_MSC_VER) -#include <malloc.h> -#ifdef alloc -# undef alloc -#endif -#define alloc _alloc -#ifdef alloca -# undef alloca -#endif -#define alloca _alloca -#endif -#if !defined _WINDOWS && !defined WIN32 -#include <alloca.h> +#if (defined(_WINDOWS) || defined (WIN32)) +# include <malloc.h> + +# if defined(_MSC_VER) +# ifdef alloc +# undef alloc +# endif +# define alloc _alloc +# ifdef alloca +# undef alloca +# endif +# define alloca _alloca +# endif +# if !defined _WINDOWS && !defined WIN32 +# include <alloca.h> +# endif #endif #endif /*!QPID_SYS_ALLOCA_H*/ diff --git a/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp b/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp index 38d8842521..71138757a5 100644 --- a/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp +++ b/qpid/cpp/src/qpid/sys/windows/AsynchIO.cpp @@ -30,6 +30,7 @@ #include "qpid/log/Statement.h" #include "qpid/sys/windows/check.h" +#include "qpid/sys/windows/mingw32_compat.h" #include <boost/thread/once.hpp> @@ -114,7 +115,8 @@ AsynchAcceptor::~AsynchAcceptor() } void AsynchAcceptor::start(Poller::shared_ptr poller) { - poller->monitorHandle(PollerHandle(socket), Poller::INPUT); + PollerHandle ph = PollerHandle(socket); + poller->monitorHandle(ph, Poller::INPUT); restart (); } @@ -154,7 +156,7 @@ void AsynchAcceptResult::success(size_t /*bytesTransferred*/) { delete this; } -void AsynchAcceptResult::failure(int status) { +void AsynchAcceptResult::failure(int /*status*/) { //if (status != WSA_OPERATION_ABORTED) // Can there be anything else? ; delete this; @@ -410,8 +412,9 @@ void AsynchIO::queueForDeletion() { } void AsynchIO::start(Poller::shared_ptr poller0) { + PollerHandle ph = PollerHandle(socket); poller = poller0; - poller->monitorHandle(PollerHandle(socket), Poller::INPUT); + poller->monitorHandle(ph, Poller::INPUT); if (writeQueue.size() > 0) // Already have data queued for write notifyPendingWrite(); startReading(); @@ -584,7 +587,6 @@ void AsynchIO::notifyIdle(void) { void AsynchIO::startWrite(AsynchIO::BufferBase* buff) { writeInProgress = true; InterlockedIncrement(&opsInProgress); - int writeCount = buff->byteCount-buff->dataCount; AsynchWriteResult *result = new AsynchWriteResult(boost::bind(&AsynchIO::completion, this, _1), buff, diff --git a/qpid/cpp/src/qpid/sys/windows/Socket.cpp b/qpid/cpp/src/qpid/sys/windows/Socket.cpp index 11fb8b4133..2ce274acc9 100755 --- a/qpid/cpp/src/qpid/sys/windows/Socket.cpp +++ b/qpid/cpp/src/qpid/sys/windows/Socket.cpp @@ -19,6 +19,11 @@ * */ +// Ensure we get all of winsock2.h +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#endif + #include "qpid/sys/Socket.h" #include "qpid/sys/SocketAddress.h" #include "qpid/sys/windows/IoHandlePrivate.h" diff --git a/qpid/cpp/src/qpid/sys/windows/SocketAddress.cpp b/qpid/cpp/src/qpid/sys/windows/SocketAddress.cpp index 501cff1297..5efdad0183 100644 --- a/qpid/cpp/src/qpid/sys/windows/SocketAddress.cpp +++ b/qpid/cpp/src/qpid/sys/windows/SocketAddress.cpp @@ -19,6 +19,11 @@ * */ +// Ensure we get all of winsock2.h +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0501 +#endif + #include "qpid/sys/SocketAddress.h" #include "qpid/sys/windows/check.h" diff --git a/qpid/cpp/src/qpid/sys/windows/StrError.cpp b/qpid/cpp/src/qpid/sys/windows/StrError.cpp index 9c1bfcd79c..546d399d16 100755 --- a/qpid/cpp/src/qpid/sys/windows/StrError.cpp +++ b/qpid/cpp/src/qpid/sys/windows/StrError.cpp @@ -30,6 +30,7 @@ namespace sys { std::string strError(int err) { const size_t bufsize = 512; char buf[bufsize]; + buf[0] = 0; if (0 == FormatMessage (FORMAT_MESSAGE_MAX_WIDTH_MASK | FORMAT_MESSAGE_FROM_SYSTEM, 0, @@ -39,7 +40,11 @@ std::string strError(int err) { bufsize, 0)) { - strerror_s (buf, bufsize, err); +#ifdef _MSC_VER + strerror_s(buf, bufsize, err); +#else + return std::string(strerror(err)); +#endif } return std::string(buf); } diff --git a/qpid/cpp/src/qpid/sys/windows/Time.cpp b/qpid/cpp/src/qpid/sys/windows/Time.cpp index fe937bd2de..25c50819cd 100644 --- a/qpid/cpp/src/qpid/sys/windows/Time.cpp +++ b/qpid/cpp/src/qpid/sys/windows/Time.cpp @@ -102,7 +102,11 @@ void outputFormattedNow(std::ostream& o) { char time_string[100]; ::time( &rawtime ); +#ifdef _MSC_VER ::localtime_s(&timeinfo, &rawtime); +#else + timeinfo = *(::localtime(&rawtime)); +#endif ::strftime(time_string, 100, "%Y-%m-%d %H:%M:%S", &timeinfo); diff --git a/qpid/cpp/src/qpid/sys/windows/mingw32_compat.h b/qpid/cpp/src/qpid/sys/windows/mingw32_compat.h new file mode 100644 index 0000000000..51f613cc25 --- /dev/null +++ b/qpid/cpp/src/qpid/sys/windows/mingw32_compat.h @@ -0,0 +1,39 @@ +#ifndef _sys_windows_mingw32_compat +#define _sys_windows_mingw32_compat +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * + */ + +#ifdef WIN32 +#ifndef _MSC_VER + +// +// The following definitions for extension function GUIDs and signatures are taken from +// MswSock.h in the Windows32 SDK. These rightfully belong in the mingw32 version of +// mswsock.h, but are not included presently. +// + +#define WSAID_ACCEPTEX {0xb5367df1,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}} +typedef BOOL (PASCAL *LPFN_ACCEPTEX)(SOCKET,SOCKET,PVOID,DWORD,DWORD,DWORD,LPDWORD,LPOVERLAPPED); + +#endif +#endif + +#endif diff --git a/qpid/cpp/src/qpid/sys/windows/uuid.cpp b/qpid/cpp/src/qpid/sys/windows/uuid.cpp index b5360622dc..3316ecbc00 100644 --- a/qpid/cpp/src/qpid/sys/windows/uuid.cpp +++ b/qpid/cpp/src/qpid/sys/windows/uuid.cpp @@ -19,7 +19,7 @@ * */ -#include <Rpc.h> +#include <rpc.h> #ifdef uuid_t /* Done in rpcdce.h */ # undef uuid_t #endif @@ -52,7 +52,11 @@ int uuid_parse (const char *in, uuid_t uu) { void uuid_unparse (const uuid_t uu, char *out) { unsigned char *formatted; if (UuidToString((UUID*)uu, &formatted) == RPC_S_OK) { +#ifdef _MSC_VER strncpy_s (out, 36+1, (char*)formatted, _TRUNCATE); +#else + strncpy (out, (char*)formatted, 36+1); +#endif RpcStringFree(&formatted); } } diff --git a/qpid/cpp/src/tests/TimerTest.cpp b/qpid/cpp/src/tests/TimerTest.cpp index 7df94164e0..6a0a196f4e 100644 --- a/qpid/cpp/src/tests/TimerTest.cpp +++ b/qpid/cpp/src/tests/TimerTest.cpp @@ -77,8 +77,10 @@ class TestTask : public TimerTask BOOST_CHECK(fired); BOOST_CHECK_EQUAL(expected_position, position); Duration actual(start, end); -#ifdef _WIN32 +#ifdef _MSC_VER uint64_t difference = _abs64(expected - actual); +#elif defined(_WIN32) + uint64_t difference = labs(expected - actual); #else uint64_t difference = abs(expected - actual); #endif diff --git a/qpid/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp b/qpid/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp index a0b665db73..024f20b147 100644 --- a/qpid/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp +++ b/qpid/cpp/src/tests/windows/DisableWin32ErrorWindows.cpp @@ -26,7 +26,9 @@ // include this file with the executable being built. If the default // behaviors are desired, don't include this file in the build. +#if defined(_MSC_VER) #include <crtdbg.h> +#endif #include <windows.h> #include <iostream> @@ -53,12 +55,14 @@ static redirect_errors_to_stderr block; redirect_errors_to_stderr::redirect_errors_to_stderr() { +#if defined(_MSC_VER) _CrtSetReportMode (_CRT_WARN, _CRTDBG_MODE_FILE); _CrtSetReportFile (_CRT_WARN, _CRTDBG_FILE_STDERR); _CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_FILE); _CrtSetReportFile (_CRT_ERROR, _CRTDBG_FILE_STDERR); _CrtSetReportMode (_CRT_ASSERT, _CRTDBG_MODE_FILE); _CrtSetReportFile (_CRT_ASSERT, _CRTDBG_FILE_STDERR); +#endif // Prevent the system from displaying the critical-error-handler // and can't-open-file message boxes. |