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
  +}
  
  
  

Reply via email to