Ver Fonte

ZOOKEEPER-1643. Windows: fetch_and_add not 64bit-compatible, may not be correct (Erik Anderson via michim)

git-svn-id: https://svn.apache.org/repos/asf/zookeeper/trunk@1448007 13f79535-47bb-0310-9956-ffa450edef68
Michi Mutsuzaki há 12 anos atrás
pai
commit
97e598b6c1
2 ficheiros alterados com 5 adições e 18 exclusões
  1. 3 0
      CHANGES.txt
  2. 2 18
      src/c/src/mt_adaptor.c

+ 3 - 0
CHANGES.txt

@@ -505,6 +505,9 @@ IMPROVEMENTS:
   ZOOKEEPER-1601. document changes for multi-threaded CommitProcessor
   and NIOServerCnxn (Thawan Kooburat via phunt)
 
+  ZOOKEEPER-1643. Windows: fetch_and_add not 64bit-compatible, may not be
+  correct (Erik Anderson via michim)
+
 Release 3.4.0 - 
 
 Non-backward compatible changes:

+ 2 - 18
src/c/src/mt_adaptor.c

@@ -484,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
 }