diff --git a/Utilities/cmxmlrpc/CMakeLists.txt b/Utilities/cmxmlrpc/CMakeLists.txt index 07f4a4264..bb878f732 100644 --- a/Utilities/cmxmlrpc/CMakeLists.txt +++ b/Utilities/cmxmlrpc/CMakeLists.txt @@ -47,6 +47,10 @@ SET(HAVE_LIBWWW_SSL) SET(DIRECTORY_SEPARATOR "/") FIND_PACKAGE(Threads) +SET(HAVE_PTHREADS) +IF(WIN32 OR CMAKE_USE_PTHREADS_INIT) + SET(HAVE_PTHREADS 1) +ENDIF(WIN32 OR CMAKE_USE_PTHREADS_INIT) INCLUDE_DIRECTORIES( "${CMAKE_CURRENT_SOURCE_DIR}" diff --git a/Utilities/cmxmlrpc/xmlrpc_authcookie.c b/Utilities/cmxmlrpc/xmlrpc_authcookie.c index 83541b9a2..1da929f1e 100644 --- a/Utilities/cmxmlrpc/xmlrpc_authcookie.c +++ b/Utilities/cmxmlrpc/xmlrpc_authcookie.c @@ -51,7 +51,7 @@ void xmlrpc_authcookie_set ( xmlrpc_env *env, sprintf(unencoded, "%s:%s", username, password); /* Create encoded string. */ - token = xmlrpc_base64_encode_without_newlines(env, unencoded, + token = xmlrpc_base64_encode_without_newlines(env, (unsigned char*)unencoded, strlen(unencoded)); XMLRPC_FAIL_IF_FAULT(env); diff --git a/Utilities/cmxmlrpc/xmlrpc_config.h.in b/Utilities/cmxmlrpc/xmlrpc_config.h.in index fff0e9dcd..af637c359 100644 --- a/Utilities/cmxmlrpc/xmlrpc_config.h.in +++ b/Utilities/cmxmlrpc/xmlrpc_config.h.in @@ -30,6 +30,8 @@ #define DIRECTORY_SEPARATOR "@DIRECTORY_SEPARATOR@" +#cmakedefine HAVE_PTHREADS @HAVE_PTHREADS@ + /* Xmlrpc-c code uses __inline__ to declare functions that should be compiled as inline code. GNU C recognizes the __inline__ keyword. Others recognize 'inline' or '__inline' or nothing at all to say diff --git a/Utilities/cmxmlrpc/xmlrpc_curl_transport.c b/Utilities/cmxmlrpc/xmlrpc_curl_transport.c index e98353edb..c4a5e19b9 100644 --- a/Utilities/cmxmlrpc/xmlrpc_curl_transport.c +++ b/Utilities/cmxmlrpc/xmlrpc_curl_transport.c @@ -22,7 +22,10 @@ #include #include #include -#include "xmlrpc_pthreads.h" + +#if defined(HAVE_PTHREADS) +# include "xmlrpc_pthreads.h" +#endif #include #include @@ -143,7 +146,6 @@ initWindowsStuff(xmlrpc_env * const envP) { } - static void create(xmlrpc_env * const envP, int const flags ATTR_UNUSED, @@ -163,7 +165,9 @@ create(xmlrpc_env * const envP, envP, XMLRPC_INTERNAL_ERROR, "Unable to allocate transport descriptor."); else { +#ifdef HAVE_PTHREADS pthread_mutex_init(&transportP->listLock, NULL); +#endif list_make_empty(&transportP->rpcList); @@ -183,7 +187,6 @@ create(xmlrpc_env * const envP, } - static void termWindowStuff(void) { @@ -203,7 +206,9 @@ destroy(struct clientTransport * const clientTransportP) { XMLRPC_ASSERT(list_is_empty(&clientTransportP->rpcList)); +#if defined(HAVE_PTHREADS) pthread_mutex_destroy(&clientTransportP->listLock); +#endif curl_global_cleanup(); @@ -428,7 +433,7 @@ doAsyncRpc(void * arg) { #endif - +#if defined(HAVE_PTHREADS) static void createRpcThread(xmlrpc_env * const envP, rpc * const rpcP, @@ -462,6 +467,7 @@ createRpcThread(xmlrpc_env * const envP, break; } } +#endif @@ -493,15 +499,23 @@ rpcCreate(xmlrpc_env * const envP, &rpcP->curlTransactionP); if (!envP->fault_occurred) { if (complete) { +#if defined(HAVE_PTHREADS) createRpcThread(envP, rpcP, &rpcP->thread); +#else + abort(); +#endif if (!envP->fault_occurred) rpcP->threadExists = TRUE; } if (!envP->fault_occurred) { list_init_header(&rpcP->link, rpcP); +#if defined(HAVE_PTHREADS) pthread_mutex_lock(&clientTransportP->listLock); +#endif list_add_head(&clientTransportP->rpcList, &rpcP->link); +#if defined(HAVE_PTHREADS) pthread_mutex_unlock(&clientTransportP->listLock); +#endif } if (envP->fault_occurred) destroyCurlTransaction(rpcP->curlTransactionP); @@ -513,7 +527,6 @@ rpcCreate(xmlrpc_env * const envP, } - static void rpcDestroy(rpc * const rpcP) { @@ -573,7 +586,11 @@ finishRpc(struct list_head * const headerP, void *status; int result; +#if defined(HAVE_PTHREADS) result = pthread_join(rpcP->thread, &status); +#else + abort(); +#endif rpcP->threadExists = FALSE; } @@ -601,11 +618,19 @@ finishAsynch(struct clientTransport * const clientTransportP ATTR_UNUSED, to set an alarm and interrupt running threads. */ +#if defined(HAVE_PTHREADS) pthread_mutex_lock(&clientTransportP->listLock); +#else + abort(); +#endif list_foreach(&clientTransportP->rpcList, finishRpc, NULL); +#if defined(HAVE_PTHREADS) pthread_mutex_unlock(&clientTransportP->listLock); +#else + abort(); +#endif } diff --git a/Utilities/cmxmlrpc/xmlrpc_pthreads.h b/Utilities/cmxmlrpc/xmlrpc_pthreads.h index dfb29c7c9..31d4049a1 100644 --- a/Utilities/cmxmlrpc/xmlrpc_pthreads.h +++ b/Utilities/cmxmlrpc/xmlrpc_pthreads.h @@ -26,6 +26,10 @@ #ifndef xmlrpc_pthreads_h_ #define xmlrpc_pthreads_h_ +#if !defined(HAVE_PTHREADS) +# error This system does not have PThreads +#endif + #ifndef WIN32 # define _REENTRANT # include diff --git a/Utilities/cmxmlrpc/xmlrpc_transport.h b/Utilities/cmxmlrpc/xmlrpc_transport.h index e84832f5d..1a451669a 100644 --- a/Utilities/cmxmlrpc/xmlrpc_transport.h +++ b/Utilities/cmxmlrpc/xmlrpc_transport.h @@ -6,7 +6,9 @@ extern "C" { #endif -#include "xmlrpc_pthreads.h" /* For threading helpers. */ +#if defined(HAVE_PTHREADS) +# include "xmlrpc_pthreads.h" /* For threading helpers. */ +#endif struct call_info; @@ -67,6 +69,7 @@ struct clientTransportOps { ** Transport Helper Functions and declarations. **========================================================================= */ +#if defined(HAVE_PTHREADS) typedef struct _running_thread_info { struct _running_thread_info * Next; @@ -90,6 +93,7 @@ void register_asynch_thread (running_thread_list *list, pthread_t *thread); /* MRB-WARNING: Only call when you have successfully ** acquired the Lock/Unlock mutex! */ void unregister_asynch_thread (running_thread_list *list, pthread_t *thread); +#endif #ifdef __cplusplus