Logo ROOT   6.08/07
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 #include "Rtypes.h"
39 
40 #if defined(__GLIBCXX__) // g++ 3.4+
41 
42 using __gnu_cxx::__atomic_add;
43 using __gnu_cxx::__exchange_and_add;
44 
45 #endif
46 
47 
48 class TAtomicCount {
49 private:
50  mutable _Atomic_word fCnt; // counter
51 
52  TAtomicCount(const TAtomicCount &); // not implemented
53  TAtomicCount &operator=(const TAtomicCount &); // not implemented
54 
55 public:
56  explicit TAtomicCount(Long_t v) : fCnt(v) { }
57  void operator++() { __atomic_add(&fCnt, 1); }
58  Long_t operator--() { return __exchange_and_add(&fCnt, -1) - 1; }
59  operator long() const { return __exchange_and_add(&fCnt, 0); }
60  void Set(Long_t v) {
61  fCnt = v;
62 #ifdef _GLIBCXX_WRITE_MEM_BARRIER
63 #if !(defined(__INTEL_COMPILER) && defined(__ia64__)) //ICC doesn't support inline asm on IA-64
64  _GLIBCXX_WRITE_MEM_BARRIER;
65 #endif
66 #endif
67  }
68  Long_t Get() const { return __exchange_and_add(&fCnt, 0); }
69 };
70 
71 #endif
Long_t operator--()
Long_t Get() const
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 &)
TAtomicCount(const TAtomicCount &)
_Atomic_word fCnt