You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@etch.apache.org by ve...@apache.org on 2012/08/02 17:19:24 UTC

svn commit: r1368526 - in /incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu: include/capu/os/ include/capu/os/arch/Linux_ARM_V7L/ include/capu/os/arch/Linux_X86_32/ include/capu/os/arch/Linux_X86_64/ include/capu/os/arch/Windows_X86_32/ i...

Author: veithm
Date: Thu Aug  2 15:19:23 2012
New Revision: 1368526

URL: http://svn.apache.org/viewvc?rev=1368526&view=rev
Log:
ETCH-132 Fix for thread-safeness of SmartPointer

Added return value to atomic operations which returns the old value

Change-Id: Ic49cb5fb274fdecf1db9ceec7a54769c16674df8

Modified:
    incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/AtomicOperation.h
    incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_ARM_V7L/AtomicOperation.inc
    incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_X86_32/AtomicOperation.inc
    incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_X86_64/AtomicOperation.inc
    incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows_X86_32/AtomicOperation.inc
    incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows_X86_64/AtomicOperation.inc
    incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/util/SmartPointer.h
    incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/AtomicOperationTest.cpp
    incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/arch/X86_32/AtomicOperation.inc
    incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/arch/X86_64/AtomicOperation.inc

Modified: incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/AtomicOperation.h
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/AtomicOperation.h?rev=1368526&r1=1368525&r2=1368526&view=diff
==============================================================================
--- incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/AtomicOperation.h (original)
+++ incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/AtomicOperation.h Thu Aug  2 15:19:23 2012
@@ -1,65 +1,65 @@
-/* $Id$
-*
-* 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.
-*/
-
-#ifndef __ATOMIC_OPERATION_H__
-#define __ATOMIC_OPERATION_H__
-
-#include "capu/Config.h"
-
-#define ATOMIC_OPERATION_INC_HEADER
-#include "arch/AtomicOperation.inc"
-#undef ATOMIC_OPERATION_INC_HEADER
-
-namespace capu
-{
-  class AtomicOperation { 
-  public:
-
-    /**
-    * atomically add 'summand' to an uint32_t
-    * @param mem reference to the object
-    * @param summand amount to add
-    */
-    static void AtomicAdd32(volatile uint32_t &mem, uint32_t summand);  
-
-    /**
-    * atomically subtract 'substrahend' from an uint32_t
-    * @param mem reference to the object
-    * @param subtrahend amount to subtract
-    */
-    static void AtomicSub32(volatile uint32_t &mem, uint32_t subtrahend);
-
-    /**
-    * atomically increment an uint32_t
-    * @param mem reference to the object
-    */
-    static void AtomicInc32(volatile uint32_t &mem);  
-
-    /**
-    * atomically decrement  an uint32_t
-    * @param mem reference to the object
-    */
-    static void AtomicDec32(volatile uint32_t &mem);
-  };
-
-#define ATOMIC_OPERATION_INC_IMPL
-#include "arch/AtomicOperation.inc"
-#undef ATOMIC_OPERATION_INC_IMPL
-}
-
-#endif
+/* $Id$
+*
+* 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.
+*/
+
+#ifndef __ATOMIC_OPERATION_H__
+#define __ATOMIC_OPERATION_H__
+
+#include "capu/Config.h"
+
+#define ATOMIC_OPERATION_INC_HEADER
+#include "arch/AtomicOperation.inc"
+#undef ATOMIC_OPERATION_INC_HEADER
+
+namespace capu
+{
+  class AtomicOperation { 
+  public:
+
+    /**
+    * atomically add 'summand' to an uint32_t
+    * @param mem reference to the object
+    * @param summand amount to add
+    */
+    static uint32_t AtomicAdd32(volatile uint32_t &mem, uint32_t summand);
+
+    /**
+    * atomically subtract 'substrahend' from an uint32_t
+    * @param mem reference to the object
+    * @param subtrahend amount to subtract
+    */
+    static uint32_t AtomicSub32(volatile uint32_t &mem, uint32_t subtrahend);
+
+    /**
+    * atomically increment an uint32_t
+    * @param mem reference to the object
+    */
+    static uint32_t AtomicInc32(volatile uint32_t &mem);
+
+    /**
+    * atomically decrement  an uint32_t
+    * @param mem reference to the object
+    */
+    static uint32_t AtomicDec32(volatile uint32_t &mem);
+  };
+
+#define ATOMIC_OPERATION_INC_IMPL
+#include "arch/AtomicOperation.inc"
+#undef ATOMIC_OPERATION_INC_IMPL
+}
+
+#endif

Modified: incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_ARM_V7L/AtomicOperation.inc
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_ARM_V7L/AtomicOperation.inc?rev=1368526&r1=1368525&r2=1368526&view=diff
==============================================================================
--- incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_ARM_V7L/AtomicOperation.inc (original)
+++ incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_ARM_V7L/AtomicOperation.inc Thu Aug  2 15:19:23 2012
@@ -23,7 +23,9 @@
 #endif
 
 #ifdef ATOMIC_OPERATION_INC_IMPL
-inline void AtomicOperation::AtomicAdd32(volatile uint32_t &mem, uint32_t summand) {
+inline uint32_t AtomicOperation::AtomicAdd32(volatile uint32_t &mem, uint32_t summand) {
+    //TODO: Make this thread-safe
+    uint32_t oldValue = mem;
   __asm__ volatile (
    "1: ldrex r0, [%0]      \n\t" //load mem into r0
    "add      r0,  r0,  %1  \n\t" //add summand to r0 and store result in r0
@@ -34,9 +36,14 @@ inline void AtomicOperation::AtomicAdd32
    : "r"   (&mem), "r"(summand)
    : "r0"  , "r1"
   );
+
+   return oldValue;
 }
 
-inline void AtomicOperation::AtomicSub32(volatile uint32_t &mem, uint32_t subtrahend) {
+inline uint32_t AtomicOperation::AtomicSub32(volatile uint32_t &mem, uint32_t subtrahend) {
+  //TODO: Make this thread-safe
+  uint32_t oldValue = mem;
+
   __asm__ volatile (
    "2: ldrex r0, [%0]      \n\t" //load mem into r0
    "sub      r0,  r0,  %1  \n\t" //subs subthrahend from r0 and store result in r0
@@ -47,13 +54,15 @@ inline void AtomicOperation::AtomicSub32
    : "r"   (&mem), "r"(subtrahend)
    : "r0"  , "r1"
   );
+
+   return oldValue;
 }
 
-inline void AtomicOperation::AtomicInc32(volatile uint32_t &mem){
-  AtomicAdd32(mem, 1);
+inline uint32_t AtomicOperation::AtomicInc32(volatile uint32_t &mem){
+  return AtomicAdd32(mem, 1);
 }
 
-inline void AtomicOperation::AtomicDec32(volatile uint32_t &mem) {
-  AtomicSub32(mem, 1);
+inline uint32_t AtomicOperation::AtomicDec32(volatile uint32_t &mem) {
+  return AtomicSub32(mem, 1);
 }
 #endif

Modified: incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_X86_32/AtomicOperation.inc
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_X86_32/AtomicOperation.inc?rev=1368526&r1=1368525&r2=1368526&view=diff
==============================================================================
--- incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_X86_32/AtomicOperation.inc (original)
+++ incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_X86_32/AtomicOperation.inc Thu Aug  2 15:19:23 2012
@@ -23,27 +23,35 @@
 #endif
 
 #ifdef ATOMIC_OPERATION_INC_IMPL
-inline void AtomicOperation::AtomicAdd32(volatile uint32_t &mem, uint32_t summand) {
+inline uint32_t AtomicOperation::AtomicAdd32(volatile uint32_t &mem, uint32_t summand) {
 //This code comes from the Apache APR project (apache-apr/1.4.2/atomic/unix/ia32.c)
-  asm volatile ("lock; xaddl %0,%1"
+  asm volatile (
+    "lock; xaddl %0,%1"
   : "=r" (summand), "=m" (mem)
   : "0" (summand), "m" (mem)
   : "memory", "cc");
+
+  return summand;
+
 }
 
-inline void AtomicOperation::AtomicSub32(volatile uint32_t &mem, uint32_t subtrahend) {
+inline uint32_t AtomicOperation::AtomicSub32(volatile uint32_t &mem, uint32_t subtrahend) {
 //This code comes from the Apache APR project (apache-apr/1.4.2/atomic/unix/ia32.c)
-  asm volatile ("lock; subl %1, %0"
-  : /* no output */
-  : "m" (mem), "r" (subtrahend)
+  int32_t summand = subtrahend * -1;
+  asm volatile (
+    "lock; xaddl %0,%1"
+  : "=r" (summand), "=m" (mem)
+  : "0" (summand), "m" (mem)
   : "memory", "cc");
+
+    return summand;
 }
 
-inline void AtomicOperation::AtomicInc32(volatile uint32_t &mem) {
-  AtomicAdd32(mem, 1);
+inline uint32_t AtomicOperation::AtomicInc32(volatile uint32_t &mem) {
+  return AtomicAdd32(mem, 1);
 }
 
-inline void AtomicOperation::AtomicDec32(volatile uint32_t &mem) { 
-  AtomicSub32(mem, 1);
+inline uint32_t AtomicOperation::AtomicDec32(volatile uint32_t &mem) { 
+  return AtomicSub32(mem, 1);
 }
 #endif

Modified: incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_X86_64/AtomicOperation.inc
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_X86_64/AtomicOperation.inc?rev=1368526&r1=1368525&r2=1368526&view=diff
==============================================================================
--- incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_X86_64/AtomicOperation.inc (original)
+++ incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Linux_X86_64/AtomicOperation.inc Thu Aug  2 15:19:23 2012
@@ -23,27 +23,33 @@
 #endif
 
 #ifdef ATOMIC_OPERATION_INC_IMPL
-inline void AtomicOperation::AtomicAdd32(volatile uint32_t &mem, uint32_t summand) {
+inline uint32_t AtomicOperation::AtomicAdd32(volatile uint32_t &mem, uint32_t summand) {
 //This code comes from the Apache APR project (apache-apr/1.4.2/atomic/unix/ia32.c)
   asm volatile ("lock; xadd %0,%1"
   : "=r" (summand), "=m" (mem)
   : "0" (summand), "m" (mem)
   : "memory", "cc");
+
+  return summand;
 }
 
-inline void AtomicOperation::AtomicSub32(volatile uint32_t &mem, uint32_t subtrahend) {
+inline uint32_t AtomicOperation::AtomicSub32(volatile uint32_t &mem, uint32_t subtrahend) {
 //This code comes from the Apache APR project (apache-apr/1.4.2/atomic/unix/ia32.c)
-  asm volatile ("lock; sub %1, %0"
-  : /* no output */
-  : "m" (mem), "r" (subtrahend)
+  
+  int32_t summand = subtrahend * -1;
+  asm volatile ("lock; xadd %0,%1"
+  : "=r" (summand), "=m" (mem)
+  : "0" (summand), "m" (mem)
   : "memory", "cc");
+
+  return summand;
 }
 
-inline void AtomicOperation::AtomicInc32(volatile uint32_t &mem) {
-  AtomicAdd32(mem, 1);
+inline uint32_t AtomicOperation::AtomicInc32(volatile uint32_t &mem) {
+  return AtomicAdd32(mem, 1);
 }
 
-inline void AtomicOperation::AtomicDec32(volatile uint32_t &mem) { 
-  AtomicSub32(mem, 1);
+inline uint32_t AtomicOperation::AtomicDec32(volatile uint32_t &mem) { 
+  return AtomicSub32(mem, 1);
 }
 #endif

Modified: incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows_X86_32/AtomicOperation.inc
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows_X86_32/AtomicOperation.inc?rev=1368526&r1=1368525&r2=1368526&view=diff
==============================================================================
--- incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows_X86_32/AtomicOperation.inc (original)
+++ incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows_X86_32/AtomicOperation.inc Thu Aug  2 15:19:23 2012
@@ -25,19 +25,20 @@
 
 #ifdef ATOMIC_OPERATION_INC_IMPL
 
-inline void AtomicOperation::AtomicAdd32(volatile uint32_t &mem, uint32_t summand){
-  InterlockedExchangeAdd((long*)&mem, summand);
+inline uint32_t AtomicOperation::AtomicAdd32(volatile uint32_t &mem, uint32_t summand){
+  return InterlockedExchangeAdd((long*)&mem, summand);
 }
 
-inline void AtomicOperation::AtomicSub32(volatile uint32_t &mem, uint32_t subtrahend) {
-  InterlockedExchangeAdd((long*)&mem, 0-subtrahend);
+inline uint32_t AtomicOperation::AtomicSub32(volatile uint32_t &mem, uint32_t subtrahend) {
+  return InterlockedExchangeAdd((long*)&mem, 0-subtrahend);
 }
 
-inline void AtomicOperation::AtomicInc32(volatile uint32_t &mem) {
-  AtomicAdd32(mem, 1);
+inline uint32_t AtomicOperation::AtomicInc32(volatile uint32_t &mem) {
+  return AtomicAdd32(mem, 1);
 }
 
-inline void AtomicOperation::AtomicDec32(volatile uint32_t &mem) { 
-  AtomicSub32(mem, 1);
+inline uint32_t AtomicOperation::AtomicDec32(volatile uint32_t &mem) { 
+  return AtomicSub32(mem, 1);;
+  
 }
 #endif

Modified: incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows_X86_64/AtomicOperation.inc
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows_X86_64/AtomicOperation.inc?rev=1368526&r1=1368525&r2=1368526&view=diff
==============================================================================
--- incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows_X86_64/AtomicOperation.inc (original)
+++ incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/os/arch/Windows_X86_64/AtomicOperation.inc Thu Aug  2 15:19:23 2012
@@ -25,19 +25,19 @@
 
 #ifdef ATOMIC_OPERATION_INC_IMPL
 
-inline void AtomicOperation::AtomicAdd32(volatile uint32_t &mem, uint32_t summand){
-  InterlockedExchangeAdd((long*)&mem, summand);
+inline uint32_t AtomicOperation::AtomicAdd32(volatile uint32_t &mem, uint32_t summand){
+  return InterlockedExchangeAdd((long*)&mem, summand);
 }
 
-inline void AtomicOperation::AtomicSub32(volatile uint32_t &mem, uint32_t subtrahend) {
-  InterlockedExchangeAdd((long*)&mem, 0-subtrahend);
+inline uint32_t AtomicOperation::AtomicSub32(volatile uint32_t &mem, uint32_t subtrahend) {
+  return InterlockedExchangeAdd((long*)&mem, 0-subtrahend);
 }
 
-inline void AtomicOperation::AtomicInc32(volatile uint32_t &mem) {
-  AtomicAdd32(mem, 1);
+inline uint32_t AtomicOperation::AtomicInc32(volatile uint32_t &mem) {
+  return AtomicAdd32(mem, 1);
 }
 
-inline void AtomicOperation::AtomicDec32(volatile uint32_t &mem) { 
-  AtomicSub32(mem, 1);
+inline uint32_t AtomicOperation::AtomicDec32(volatile uint32_t &mem) { 
+  return AtomicSub32(mem, 1);
 }
 #endif

Modified: incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/util/SmartPointer.h
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/util/SmartPointer.h?rev=1368526&r1=1368525&r2=1368526&view=diff
==============================================================================
--- incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/util/SmartPointer.h (original)
+++ incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/include/capu/util/SmartPointer.h Thu Aug  2 15:19:23 2012
@@ -256,8 +256,8 @@ namespace capu {
   inline
   void SmartPointer<T>::decRefCount() {
     if (mReferenceCount) {
-      capu::AtomicOperation::AtomicDec32(*mReferenceCount);
-      if (!(*mReferenceCount)) {
+      uint32_t oldValue = capu::AtomicOperation::AtomicDec32(*mReferenceCount);
+      if (--oldValue == 0) {
         freeData();
       }
     }

Modified: incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/AtomicOperationTest.cpp
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/AtomicOperationTest.cpp?rev=1368526&r1=1368525&r2=1368526&view=diff
==============================================================================
--- incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/AtomicOperationTest.cpp (original)
+++ incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/AtomicOperationTest.cpp Thu Aug  2 15:19:23 2012
@@ -24,24 +24,28 @@
 
 TEST(AtomicOperation,Add) {
   capu::uint32_t val = 100;
-  capu::AtomicOperation::AtomicAdd32(val, 3);
+  capu::uint32_t ret = capu::AtomicOperation::AtomicAdd32(val, 3);
   EXPECT_EQ((capu::uint32_t) 103,val);
+  EXPECT_EQ(ret, 100);
 }
 
 TEST(AtomicOperation,Sub) {
   capu::uint32_t val = 13;
-  capu::AtomicOperation::AtomicSub32(val, 5);
+  capu::uint32_t ret = capu::AtomicOperation::AtomicSub32(val, 5);
   EXPECT_EQ((capu::uint32_t) 8,val);
+  EXPECT_EQ(ret, 13);
 }
 
 TEST(AtomicOperation,Inc) {
   capu::uint32_t val = 1;
-  capu::AtomicOperation::AtomicInc32(val);
+  capu::uint32_t ret = capu::AtomicOperation::AtomicInc32(val);
   EXPECT_EQ((capu::uint32_t) 2,val);
+  EXPECT_EQ(ret, 1);
 }
 
 TEST(AtomicOperation,Dec) {
   capu::uint32_t val = 3;
-  capu::AtomicOperation::AtomicDec32(val);
+  capu::uint32_t ret = capu::AtomicOperation::AtomicDec32(val);
   EXPECT_EQ((capu::uint32_t) 2,val);
+  EXPECT_EQ(ret, 3);
 }
\ No newline at end of file

Modified: incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/arch/X86_32/AtomicOperation.inc
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/arch/X86_32/AtomicOperation.inc?rev=1368526&r1=1368525&r2=1368526&view=diff
==============================================================================
--- incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/arch/X86_32/AtomicOperation.inc (original)
+++ incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/arch/X86_32/AtomicOperation.inc Thu Aug  2 15:19:23 2012
@@ -20,12 +20,14 @@
 
 TEST(AtomicOperation, Add_Overflow_X86_32) {
   capu::uint32_t val = 4294967295u;
-  capu::AtomicOperation::AtomicAdd32(val, 3);
+  capu::uint32_t ret = capu::AtomicOperation::AtomicAdd32(val, 3);
   EXPECT_EQ((capu::uint32_t) 2, val);
+  EXPECT_EQ(ret, 4294967295u);
 }
 
 TEST(AtomicOperation, Sub_Overflow_X86_32) {
   capu::uint32_t val = 0;
-  capu::AtomicOperation::AtomicSub32(val, 5);
+  capu::uint32_t ret = capu::AtomicOperation::AtomicSub32(val, 5);
   EXPECT_EQ((capu::uint32_t) 4294967291u, val);
+  EXPECT_EQ(ret, 0u);
 }
\ No newline at end of file

Modified: incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/arch/X86_64/AtomicOperation.inc
URL: http://svn.apache.org/viewvc/incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/arch/X86_64/AtomicOperation.inc?rev=1368526&r1=1368525&r2=1368526&view=diff
==============================================================================
--- incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/arch/X86_64/AtomicOperation.inc (original)
+++ incubator/etch/trunk/binding-cpp/runtime/lib/capu/modules/capu/test/os/arch/X86_64/AtomicOperation.inc Thu Aug  2 15:19:23 2012
@@ -18,8 +18,9 @@
 
  TEST(AtomicOperation,Add_NoOverflow_X86_64) {
   capu::uint32_t val = 4294967295u;
-  capu::AtomicOperation::AtomicAdd32(val, 3);
+  capu::uint32_t ret = capu::AtomicOperation::AtomicAdd32(val, 3);
   EXPECT_EQ((capu::uint32_t) 4294967298u,val);
+  EXPECT_EQ(ret, 4294967295u);
 }
 
 //disabled until *64 methods are implemented