You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4cxx-dev@logging.apache.org by mc...@apache.org on 2004/04/02 11:06:04 UTC
cvs commit: logging-log4cxx/src thread.cpp
mcatan 2004/04/02 01:06:04
Modified: src thread.cpp
Log:
added InterlockedIncrement and InterlockedDecrement
Revision Changes Path
1.8 +46 -0 logging-log4cxx/src/thread.cpp
Index: thread.cpp
===================================================================
RCS file: /home/cvs/logging-log4cxx/src/thread.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- thread.cpp 7 Mar 2004 06:14:00 -0000 1.7
+++ thread.cpp 2 Apr 2004 09:06:04 -0000 1.8
@@ -159,3 +159,49 @@
break;
}
}
+
+#ifdef __GLIBCPP__
+#include <bits/atomicity.h>
+#endif
+
+long Thread::InterlockedIncrement(volatile long * val)
+{
+#ifdef __GLIBCPP__
+ return __exchange_and_add((volatile _Atomic_word *)val, 1 ) + 1;
+#elif defined(__i386__)
+ long ret;
+
+ __asm__ __volatile__ ("lock; xaddl %0, %1"
+ : "=r" (ret), "=m" (*val)
+ : "0" (1), "m" (*val));
+
+ return ret+1;
+#elif defined(HAVE_MS_THREAD)
+#if _MSC_VER == 1200 // MSDEV 6
+ return ::InterlockedIncrement((long *)val);
+#else
+ return ::InterlockedIncrement(val);
+#endif // _MSC_VER
+#endif
+}
+
+long Thread::InterlockedDecrement(volatile long * val)
+{
+#ifdef __GLIBCPP__
+ return __exchange_and_add((volatile _Atomic_word *)val, -1 ) - 1;
+#elif defined(__i386__)
+ long ret;
+
+ __asm__ __volatile__ ("lock; xaddl %0, %1"
+ : "=r" (ret), "=m" (*val)
+ : "0" (-1), "m" (*val));
+
+ return ret-1;
+#elif defined(HAVE_MS_THREAD)
+#if _MSC_VER == 1200 // MSDEV 6
+ return ::InterlockedDecrement((long *)val);
+#else
+ return ::InterlockedDecrement(val);
+#endif // _MSC_VER
+#endif
+}