blob: 96f2d1032526f996e530777b23bf9298121284f7 [file] [log] [blame]
From 64697ddd8a90f29d1693658f04e975e435e3c869 Mon Sep 17 00:00:00 2001
From: unknown <norrisl@NorrisL.simba.ad>
Date: Thu, 5 Jun 2014 16:40:48 -0700
Subject: [PATCH] Allow zookeeper to build in x64
---
src/c/include/winstdint.h | 4 ++++
src/c/src/mt_adaptor.c | 54 +++++++++++++++++++++++------------------------
2 files changed, 30 insertions(+), 28 deletions(-)
diff --git a/src/c/include/winstdint.h b/src/c/include/winstdint.h
index d02608a..df405f7 100644
--- a/src/c/include/winstdint.h
+++ b/src/c/include/winstdint.h
@@ -40,6 +40,9 @@
#pragma once
#endif
+#if (_MSC_VER > 1500) // Visual Studio 2010 and Beyond
+#include <stdint.h>
+#else
#include <limits.h>
// For Visual Studio 6 in C++ mode and for many Visual Studio versions when
@@ -244,4 +247,5 @@ typedef uint64_t uintmax_t;
#endif // __STDC_CONSTANT_MACROS ]
+#endif
#endif // _MSC_STDINT_H_ ]
diff --git a/src/c/src/mt_adaptor.c b/src/c/src/mt_adaptor.c
index 974063f..5ce0fd9 100644
--- a/src/c/src/mt_adaptor.c
+++ b/src/c/src/mt_adaptor.c
@@ -114,7 +114,7 @@ int process_async(int outstanding_sync)
unsigned __stdcall do_io( void * );
unsigned __stdcall do_completion( void * );
-int handle_error(SOCKET sock, char* message)
+int handle_error(zhandle_t* zh, SOCKET sock, char* message)
{
LOG_ERROR(("%s. %d",message, WSAGetLastError()));
closesocket (sock);
@@ -122,7 +122,7 @@ int handle_error(SOCKET sock, char* message)
}
//--create socket pair for interupting selects.
-int create_socket_pair(SOCKET fds[2])
+int create_socket_pair(zhandle_t* zh, SOCKET fds[2])
{
struct sockaddr_in inaddr;
struct sockaddr addr;
@@ -141,23 +141,23 @@ int create_socket_pair(SOCKET fds[2])
inaddr.sin_port = 0; //--system assigns the port
if ( setsockopt(lst,SOL_SOCKET,SO_REUSEADDR,(char*)&yes,sizeof(yes)) == SOCKET_ERROR ) {
- return handle_error(lst,"Error trying to set socket option.");
+ return handle_error(zh, lst,"Error trying to set socket option.");
}
if (bind(lst,(struct sockaddr *)&inaddr,sizeof(inaddr)) == SOCKET_ERROR){
- return handle_error(lst,"Error trying to bind socket.");
+ return handle_error(zh, lst,"Error trying to bind socket.");
}
if (listen(lst,1) == SOCKET_ERROR){
- return handle_error(lst,"Error trying to listen on socket.");
+ return handle_error(zh, lst,"Error trying to listen on socket.");
}
len=sizeof(inaddr);
getsockname(lst, &addr,&len);
fds[0]=socket(AF_INET, SOCK_STREAM,0);
if (connect(fds[0],&addr,len) == SOCKET_ERROR){
- return handle_error(lst, "Error while connecting to socket.");
+ return handle_error(zh, lst, "Error while connecting to socket.");
}
if ((fds[1]=accept(lst,0,0)) == INVALID_SOCKET){
closesocket(fds[0]);
- return handle_error(lst, "Error while accepting socket connection.");
+ return handle_error(zh, lst, "Error while accepting socket connection.");
}
closesocket(lst);
return 0;
@@ -238,11 +238,11 @@ int adaptor_init(zhandle_t *zh)
/* We use a pipe for interrupting select() in unix/sol and socketpair in windows. */
#ifdef WIN32
- if (create_socket_pair(adaptor_threads->self_pipe) == -1){
+ if (create_socket_pair(zh, adaptor_threads->self_pipe) == -1){
LOG_ERROR(("Can't make a socket."));
#else
if(pipe(adaptor_threads->self_pipe)==-1) {
- LOG_ERROR(("Can't make a pipe %d",errno));
+ LOG_ERROR(LOGCALLBACK(zh), "Can't make a pipe %d",errno);
#endif
free(adaptor_threads);
return -1;
@@ -255,6 +255,7 @@ int adaptor_init(zhandle_t *zh)
zh->adaptor_priv = adaptor_threads;
pthread_mutex_init(&zh->to_process.lock,0);
pthread_mutex_init(&adaptor_threads->zh_lock,0);
+ pthread_mutex_init(&adaptor_threads->zh_lock,0);
// to_send must be recursive mutex
pthread_mutexattr_init(&recursive_mx_attr);
pthread_mutexattr_settype(&recursive_mx_attr, PTHREAD_MUTEX_RECURSIVE);
@@ -364,7 +365,7 @@ void *do_io(void *v)
api_prolog(zh);
notify_thread_ready(zh);
- LOG_DEBUG(("started IO thread"));
+ LOG_DEBUG(LOGCALLBACK(zh), "started IO thread");
fds[0].fd=adaptor_threads->self_pipe[0];
fds[0].events=POLLIN;
while(!zh->close_requested) {
@@ -483,25 +484,9 @@ int32_t inc_ref_counter(zhandle_t* zh,int i)
int32_t fetch_and_add(volatile int32_t* operand, int incr)
{
#ifndef WIN32
- int32_t result;
- asm __volatile__(
- "lock xaddl %0,%1\n"
- : "=r"(result), "=m"(*(int *)operand)
- : "0"(incr)
- : "memory");
- return result;
+ return __sync_fetch_and_add(operand, incr);
#else
- volatile int32_t result;
- _asm
- {
- mov eax, operand; //eax = v;
- mov ebx, incr; // ebx = i;
- mov ecx, 0x0; // ecx = 0;
- lock xadd dword ptr [eax], ecx;
- lock xadd dword ptr [eax], ebx;
- mov result, ecx; // result = ebx;
- }
- return result;
+ return InterlockedExchangeAdd(operand, incr);
#endif
}
@@ -515,6 +500,19 @@ __attribute__((constructor)) int32_t get_xid()
return fetch_and_add(&xid,1);
}
+void lock_reconfig(struct _zhandle *zh)
+{
+ struct adaptor_threads *adaptor = zh->adaptor_priv;
+ if(adaptor)
+ pthread_mutex_lock(&adaptor->zh_lock);
+}
+void unlock_reconfig(struct _zhandle *zh)
+{
+ struct adaptor_threads *adaptor = zh->adaptor_priv;
+ if(adaptor)
+ pthread_mutex_lock(&adaptor->zh_lock);
+}
+
void enter_critical(zhandle_t* zh)
{
struct adaptor_threads *adaptor = zh->adaptor_priv;
--
1.9.2.msysgit.0