CernVM-FS  2.13.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
fence.h
Go to the documentation of this file.
1 
5 #ifndef CVMFS_FENCE_H_
6 #define CVMFS_FENCE_H_
7 
8 #include "gtest/gtest_prod.h"
9 #include "util/atomic.h"
10 #include "util/posix.h"
11 #include "util/single_copy.h"
12 
13 #ifdef CVMFS_NAMESPACE_GUARD
14 namespace CVMFS_NAMESPACE_GUARD {
15 #endif
16 
25 class Fence : public SingleCopy {
26  FRIEND_TEST(T_Fence, Basics);
27 
28  public:
29  Fence() {
30  atomic_init64(&counter_);
31  atomic_init32(&blocking_);
32  }
33 
34  void Enter() {
35  while (atomic_read32(&blocking_)) {
36  SafeSleepMs(kBusyWaitBackoffMs);
37  }
38  atomic_inc64(&counter_);
39  }
40 
41  void Leave() { atomic_dec64(&counter_); }
42 
43  void Close() { atomic_cas32(&blocking_, 0, 1); }
44 
48  void Drain() {
49  Close();
50  while (atomic_read64(&counter_) > 0) {
51  SafeSleepMs(kBusyWaitBackoffMs);
52  }
53  }
54 
55  void Open() { atomic_cas32(&blocking_, 1, 0); }
56 
57  private:
58  static const unsigned kBusyWaitBackoffMs = 100;
59 
64 
69 };
70 
71 
76 class FenceGuard {
77  public:
78  explicit FenceGuard(Fence *fence) : fence_(fence) { fence_->Enter(); }
79  ~FenceGuard() { fence_->Leave(); }
80 
81  private:
83 };
84 
85 #ifdef CVMFS_NAMESPACE_GUARD
86 } // namespace CVMFS_NAMESPACE_GUARD
87 #endif
88 
89 #endif // CVMFS_FENCE_H_
int64_t atomic_int64
Definition: atomic.h:18
void Enter()
Definition: fence.h:34
atomic_int64 counter_
Definition: fence.h:63
~FenceGuard()
Definition: fence.h:79
int32_t atomic_int32
Definition: atomic.h:17
atomic_int32 blocking_
Definition: fence.h:68
void Drain()
Definition: fence.h:48
Fence()
Definition: fence.h:29
void Leave()
Definition: fence.h:41
FenceGuard(Fence *fence)
Definition: fence.h:78
Definition: fence.h:25
void SafeSleepMs(const unsigned ms)
Definition: posix.cc:2025
void Close()
Definition: fence.h:43
Fence * fence_
Definition: fence.h:82
void Open()
Definition: fence.h:55