omp_rw_lock.h
Go to the documentation of this file.
1 /*
2  @copyright Russell Standish 2000-2013
3  @author Russell Standish
4  This file is part of EcoLab
5 
6  Open source licensed under the MIT license. See LICENSE for details.
7 */
8 
13 #ifndef OMP_RW_LOCK_H
14 #define OMP_RW_LOCK_H
15 
16 #ifdef _OPENMP
17 #include <omp.h>
18 
19 
20 namespace ecolab
21 {
23  class RWlock
24  {
30  volatile unsigned long read_mask;
31  omp_lock_t write_lock;
32  public:
33  RWlock(): read_mask(0) {omp_init_lock(&write_lock);}
34  ~RWlock() {omp_destroy_lock(&write_lock);}
35 
36  void lock_for_read() {
37  omp_set_lock(&write_lock);
38 #pragma omp atomic
39  read_mask |= (1 << omp_get_thread_num());
40  omp_unset_lock(&write_lock);
41  }
42 
43  void unlock_for_read() {
44 #pragma omp atomic
45  read_mask &= ~(1 << omp_get_thread_num());
46  }
47 
48  void lock_for_write() {
49  unsigned long read_set = read_mask & (1 << omp_get_thread_num());
50  unlock_for_read();
51  omp_set_lock(&write_lock);
52  //wait for read locks on other threads to be relinquished
53  while (read_mask);
54 #pragma omp atomic
55  read_mask |= read_set; //reestablish previous read lock status.
56  }
57 
58  void unlock_for_write() {
59  omp_unset_lock(&write_lock);
60  }
61 
62  };
63 
66  class read_lock
67  {
68  RWlock& lock;
69  public:
70  read_lock(RWlock& lock): lock(lock) {lock.lock_for_read();}
71  ~read_lock() {lock.unlock_for_read();}
72  };
73 
75  class write_lock
76  {
77  RWlock& lock;
78  public:
79  write_lock(RWlock& lock): lock(lock) {lock.lock_for_write();}
80  ~write_lock() {lock.unlock_for_write();}
81  };
82 }
83 #else
84 namespace ecolab
85 {
86  class RWlock {};
87  struct read_lock
88  {
89  read_lock(RWlock& lock) {}
90  };
91 
92  struct write_lock
93  {
94  write_lock(RWlock& lock) {}
95  };
96 
97 }
98 #endif
99 #endif
Definition: omp_rw_lock.h:87
Definition: omp_rw_lock.h:86
_OPENMP
Definition: accessor.h:16