Merge branch 'topic/mm-fixes' of git://208.110.73.182/silc into silc.1.1.branch
[silc.git] / lib / silcutil / silcatomic.h
index 15b393190a36f50b24b0f4fa04ec0616de43311d..de22f8022c7f25e1cce45c7785bc0fb3c36b4482 100644 (file)
@@ -298,10 +298,10 @@ SILC_ATOMIC_INIT_F(name, bits, type)                                      \
 }
 #endif /* SILC_ATOMIC_MUTEX */
 
-SILC_ATOMIC_INIT(8, 8, SilcUInt8);
-SILC_ATOMIC_INIT(16, 16, SilcUInt16);
-SILC_ATOMIC_INIT(32, 32, SilcUInt32);
-SILC_ATOMIC_INIT(_pointer, Pointer, void *);
+SILC_ATOMIC_INIT(8, 8, SilcUInt8)
+SILC_ATOMIC_INIT(16, 16, SilcUInt16)
+SILC_ATOMIC_INIT(32, 32, SilcUInt32)
+SILC_ATOMIC_INIT(_pointer, Pointer, void *)
 
 /****f* silcutil/SilcAtomicAPI/silc_atomic_uninit32
  *
@@ -372,13 +372,14 @@ SILC_ATOMIC_UNINIT_F(bits, t)                                             \
 #define SILC_ATOMIC_UNINIT(bits, t)                                    \
 SILC_ATOMIC_UNINIT_F(bits, t)                                          \
 {                                                                      \
+  memset(atomic, 0, sizeof(*atomic));                                  \
 }
 #endif /* SILC_ATOMIC_MUTEX */
 
-SILC_ATOMIC_UNINIT(8, 8);
-SILC_ATOMIC_UNINIT(16, 16);
-SILC_ATOMIC_UNINIT(32, 32);
-SILC_ATOMIC_UNINIT(_pointer, Pointer);
+SILC_ATOMIC_UNINIT(8, 8)
+SILC_ATOMIC_UNINIT(16, 16)
+SILC_ATOMIC_UNINIT(32, 32)
+SILC_ATOMIC_UNINIT(_pointer, Pointer)
 
 /****f* silcutil/SilcAtomicAPI/silc_atomic_set_int32
  *
@@ -436,7 +437,7 @@ SILC_ATOMIC_SET_INT_F(bits)                                         \
 SILC_ATOMIC_SET_INT_F(bits)                                            \
 {                                                                      \
   /* Windows */                                                                \
-  InterlockedExchange((LONG)&atomic->value, (LONG)value);              \
+  InterlockedExchange((LONG *)&atomic->value, (LONG)value);            \
 }
 
 #elif defined(__GNUC__) && (defined(SILC_I486) || defined(SILC_X86_64))
@@ -478,9 +479,9 @@ SILC_ATOMIC_SET_INT_F(bits)                                         \
 }
 #endif /* !SILC_THREADS */
 
-SILC_ATOMIC_SET_INT(8, "b", "b");
-SILC_ATOMIC_SET_INT(16, "w", "w");
-SILC_ATOMIC_SET_INT(32, "l", "");
+SILC_ATOMIC_SET_INT(8, "b", "b")
+SILC_ATOMIC_SET_INT(16, "w", "w")
+SILC_ATOMIC_SET_INT(32, "l", "")
 
 /****f* silcutil/SilcAtomicAPI/silc_atomic_set_pointer
  *
@@ -617,9 +618,9 @@ SILC_ATOMIC_GET_INT_F(bits)                                         \
 }
 #endif /* !SILC_THREADS */
 
-SILC_ATOMIC_GET_INT(8);
-SILC_ATOMIC_GET_INT(16);
-SILC_ATOMIC_GET_INT(32);
+SILC_ATOMIC_GET_INT(8)
+SILC_ATOMIC_GET_INT(16)
+SILC_ATOMIC_GET_INT(32)
 
 /****f* silcutil/SilcAtomicAPI/silc_atomic_get_pointer
  *
@@ -752,7 +753,7 @@ SILC_ATOMIC_ADD_INT_F(bits)                                         \
 SILC_ATOMIC_ADD_INT_F(bits)                                            \
 {                                                                      \
   SilcUInt##bits ret;                                                  \
-  SilcInt32 val = value;
+  SilcInt32 val = value;                                               \
   /* GCC + IA64 (GCC builtin atomic operations) */                     \
   ret = __sync_fetch_and_add(&atomic->value, val);                     \
   return ret + value;                                                  \
@@ -789,9 +790,9 @@ SILC_ATOMIC_ADD_INT_F(bits)                                         \
 }
 #endif /* !SILC_THREADS */
 
-SILC_ATOMIC_ADD_INT(8, "b");
-SILC_ATOMIC_ADD_INT(16, "w");
-SILC_ATOMIC_ADD_INT(32, "l");
+SILC_ATOMIC_ADD_INT(8, "b")
+SILC_ATOMIC_ADD_INT(16, "w")
+SILC_ATOMIC_ADD_INT(32, "l")
 
 /****f* silcutil/SilcAtomicAPI/silc_atomic_sub_int32
  *
@@ -894,7 +895,7 @@ SILC_ATOMIC_INC_F(bits)                                                     \
 SILC_ATOMIC_INC_F(bits)                                                        \
 {                                                                      \
   /* Windows */                                                                \
-  InterlockedIncrement((LONG)&atomic->value);                          \
+  InterlockedIncrement((LONG *)&atomic->value);                                \
 }
 
 #elif defined(__GNUC__) && (defined(SILC_I486) || defined(SILC_X86_64))
@@ -941,9 +942,9 @@ SILC_ATOMIC_INC_F(bits)                                                     \
 }
 #endif /* !SILC_THREADS */
 
-SILC_ATOMIC_INC(8, "b");
-SILC_ATOMIC_INC(16, "w");
-SILC_ATOMIC_INC(32, "l");
+SILC_ATOMIC_INC(8, "b")
+SILC_ATOMIC_INC(16, "w")
+SILC_ATOMIC_INC(32, "l")
 
 /****f* silcutil/SilcAtomicAPI/silc_atomic_dec32
  *
@@ -1000,7 +1001,7 @@ SILC_ATOMIC_DEC_F(bits)                                                   \
 SILC_ATOMIC_DEC_F(bits)                                                        \
 {                                                                      \
   /* Windows */                                                                \
-  InterlockedDecrement((LONG)&atomic->value);                          \
+  InterlockedDecrement((LONG *)&atomic->value);                                \
 }
 
 #elif defined(__GNUC__) && (defined(SILC_I486) || defined(SILC_X86_64))
@@ -1047,9 +1048,9 @@ SILC_ATOMIC_DEC_F(bits)                                                   \
 }
 #endif /* !SILC_THREADS */
 
-SILC_ATOMIC_DEC(8, "b");
-SILC_ATOMIC_DEC(16, "w");
-SILC_ATOMIC_DEC(32, "l");
+SILC_ATOMIC_DEC(8, "b")
+SILC_ATOMIC_DEC(16, "w")
+SILC_ATOMIC_DEC(32, "l")
 
 /****f* silcutil/SilcAtomicAPI/silc_atomic_cas32
  *
@@ -1173,9 +1174,9 @@ SILC_ATOMIC_CAS_F(bits)                                                   \
 }
 #endif /* !SILC_THREADS */
 
-SILC_ATOMIC_CAS(8, "b");
-SILC_ATOMIC_CAS(16, "w");
-SILC_ATOMIC_CAS(32, "l");
+SILC_ATOMIC_CAS(8, "b")
+SILC_ATOMIC_CAS(16, "w")
+SILC_ATOMIC_CAS(32, "l")
 
 /****f* silcutil/SilcAtomicAPI/silc_atomic_cas_pointer
  *
@@ -1208,7 +1209,8 @@ SilcBool silc_atomic_cas_pointer(SilcAtomicPointer *atomic, void *old_val,
 
 #elif defined(SILC_WIN32)
   /* Windows */
-  return InterlockedCompareExchangePointer(&atomic->value, n, o) == o;
+  return InterlockedCompareExchangePointer(&atomic->value, new_val, old_val)
+    == old_val;
 
 #elif defined(__GNUC__) && defined(SILC_I486)
   /* GCC + i486 */
@@ -1228,7 +1230,7 @@ SilcBool silc_atomic_cas_pointer(SilcAtomicPointer *atomic, void *old_val,
 
 #elif defined(__GNUC__) && defined(SILC_IA64)
   /* GCC + IA64 (GCC builtin atomic operations) */
-  return  __sync_bool_compare_and_swap((long)&atomic->value, (long)old_val,
+  return  __sync_bool_compare_and_swap((long *)&atomic->value, (long)old_val,
                                       (long)new_val);
 
 #elif defined(__GNUC__) && defined(SILC_POWERPC)