ROOT  6.06/09
Reference Guide
TAtomicCountGcc.h
Go to the documentation of this file.
1 // @(#)root/thread:$Id$
2 // Author: Fons Rademakers 14/11/06
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2006, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TAtomicCountGcc
13 #define ROOT_TAtomicCountGcc
14 
15 
16 //////////////////////////////////////////////////////////////////////////
17 // //
18 // TAtomicCountGcc //
19 // //
20 // Class providing atomic operations on a long. Setting, getting, //
21 // incrementing and decrementing are atomic, thread safe, operations. //
22 // //
23 // This implementation uses GNU libstdc++ v3 atomic primitives, see //
24 // http://gcc.gnu.org/onlinedocs/porting/Thread-safety.html. //
25 // //
26 // ATTENTION: Don't use this file directly, it is included by //
27 // TAtomicCount.h. //
28 // //
29 //////////////////////////////////////////////////////////////////////////
30 
31 #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2) || \
32  (defined(__APPLE_CC__) && __APPLE_CC__ > 5000 && !defined(MAC_OS_X_VERSION_10_6))
33 #include <bits/atomicity.h>
34 #else
35 #include <ext/atomicity.h>
36 #endif
37 
38 #if defined(__GLIBCXX__) // g++ 3.4+
39 
40 using __gnu_cxx::__atomic_add;
41 using __gnu_cxx::__exchange_and_add;
42 
43 #endif
44 
45 
46 class TAtomicCount {
47 private:
48  mutable _Atomic_word fCnt; // counter
49 
50  TAtomicCount(const TAtomicCount &); // not implemented
51  TAtomicCount &operator=(const TAtomicCount &); // not implemented
52 
53 public:
54  explicit TAtomicCount(Long_t v) : fCnt(v) { }
55  void operator++() { __atomic_add(&fCnt, 1); }
56  Long_t operator--() { return __exchange_and_add(&fCnt, -1) - 1; }
57  operator long() const { return __exchange_and_add(&fCnt, 0); }
58  void Set(Long_t v) {
59  fCnt = v;
60 #ifdef _GLIBCXX_WRITE_MEM_BARRIER
61 #if !(defined(__INTEL_COMPILER) && defined(__ia64__)) //ICC doesn't support inline asm on IA-64
62  _GLIBCXX_WRITE_MEM_BARRIER;
63 #endif
64 #endif
65  }
66  Long_t Get() const { return __exchange_and_add(&fCnt, 0); }
67 };
68 
69 #endif
Long_t operator--()
SVector< double, 2 > v
Definition: Dict.h:5
void Set(Long_t v)
TAtomicCount(Long_t v)
long Long_t
Definition: RtypesCore.h:50
TAtomicCount & operator=(const TAtomicCount &)
Long_t Get() const
TAtomicCount(const TAtomicCount &)
_Atomic_word fCnt