Robust Distributed System Nucleus (rDSN)  ver 1.0.0
zlock_provider.h
1 /*
2  * The MIT License (MIT)
3  *
4  * Copyright (c) 2015 Microsoft Corporation
5  *
6  * -=- Robust Distributed System Nucleus (rDSN) -=-
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a copy
9  * of this software and associated documentation files (the "Software"), to deal
10  * in the Software without restriction, including without limitation the rights
11  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12  * copies of the Software, and to permit persons to whom the Software is
13  * furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included in
16  * all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24  * THE SOFTWARE.
25  */
26 
27 /*
28  * Description:
29  * lock abstraction
30  *
31  * Revision history:
32  * Mar., 2015, @imzhenyu (Zhenyu Guo), first version
33  * xxxx-xx-xx, author, fix bug about xxx
34  */
35 
36 #pragma once
37 
38 # include <dsn/utility/extensible_object.h>
39 
40 namespace dsn { namespace service {
41 class zlock;
42 class zrwlock_nr;
43 class zsemaphore;
44 }}
45 
46 namespace dsn {
47 
54 class ilock
55 {
56 public:
57  virtual ~ilock() {}
58  virtual void lock() = 0;
59  virtual bool try_lock() = 0;
60  virtual void unlock() = 0;
61 };
62 
66 class lock_provider : public ilock, public extensible_object<lock_provider, 4>
67 {
68 public:
69  template <typename T> static lock_provider* create(lock_provider* inner_provider)
70  {
71  return new T(inner_provider);
72  }
73  typedef lock_provider* (*factory)(lock_provider*);
74 
75 public:
76  lock_provider(lock_provider* inner_provider) { _inner_provider = inner_provider; }
77  virtual ~lock_provider() { if (nullptr != _inner_provider) delete _inner_provider; }
78  lock_provider* get_inner_provider() const { return _inner_provider; }
79 
80 private:
81  lock_provider *_inner_provider;
82 };
83 
87 class lock_nr_provider : public ilock, public extensible_object<lock_nr_provider, 4>
88 {
89 public:
90  template <typename T> static lock_nr_provider* create(lock_nr_provider* inner_provider)
91  {
92  return new T(inner_provider);
93  }
94 
95  typedef lock_nr_provider* (*factory)(lock_nr_provider*);
96 
97 public:
98  lock_nr_provider(lock_nr_provider* inner_provider) { _inner_provider = inner_provider; }
99  virtual ~lock_nr_provider() { if (nullptr != _inner_provider) delete _inner_provider; }
100  lock_nr_provider* get_inner_provider() const { return _inner_provider; }
101 
102 private:
103  lock_nr_provider *_inner_provider;
104 };
105 
109 class rwlock_nr_provider : public extensible_object<rwlock_nr_provider, 4>
110 {
111 public:
112  template <typename T> static rwlock_nr_provider* create(rwlock_nr_provider* inner_provider)
113  {
114  return new T(inner_provider);
115  }
116 
117  typedef rwlock_nr_provider* (*factory)(rwlock_nr_provider*);
118 
119 public:
120  rwlock_nr_provider(rwlock_nr_provider* inner_provider) { _inner_provider = inner_provider; }
121  virtual ~rwlock_nr_provider() { if (nullptr != _inner_provider) delete _inner_provider; }
122 
123  virtual void lock_read() = 0;
124  virtual void unlock_read() = 0;
125  virtual bool try_lock_read() = 0;
126 
127  virtual void lock_write() = 0;
128  virtual void unlock_write() = 0;
129  virtual bool try_lock_write() = 0;
130 
131  rwlock_nr_provider* get_inner_provider() const { return _inner_provider; }
132 
133 private:
134  rwlock_nr_provider *_inner_provider;
135 };
136 
140 class semaphore_provider : public extensible_object<semaphore_provider, 4>
141 {
142 public:
143  template <typename T> static semaphore_provider* create(int initCount, semaphore_provider* inner_provider)
144  {
145  return new T(initCount, inner_provider);
146  }
147 
148  typedef semaphore_provider* (*factory)(int, semaphore_provider*);
149 
150 public:
151  semaphore_provider(int initial_count, semaphore_provider* inner_provider) { _inner_provider = inner_provider; }
152  virtual ~semaphore_provider() { if (nullptr != _inner_provider) delete _inner_provider; }
153 
154 public:
155  virtual void signal(int count) = 0;
156  virtual bool wait(int timeout_milliseconds = TIME_MS_MAX) = 0;
157 
158  semaphore_provider* get_inner_provider() const { return _inner_provider; }
159 
160 private:
161  semaphore_provider *_inner_provider;
162 };
164 } // end namespace
non-recursive exclusive lock
Definition: zlock_provider.h:87
recursive exclusive lock
Definition: zlock_provider.h:66
non-recursive rwlock
Definition: zlock_provider.h:109
semaphore
Definition: zlock_provider.h:140
Definition: address.h:52
lock interface
Definition: zlock_provider.h:54