~ubuntu-branches/debian/sid/gsmartcontrol/sid

« back to all changes in this revision

Viewing changes to .pc/04_glib2.31.patch/src/hz/sync_policy_glib.h

  • Committer: Package Import Robot
  • Author(s): Giuseppe Iuculano
  • Date: 2013-05-31 11:41:52 UTC
  • mfrom: (1.1.4)
  • Revision ID: package-import@ubuntu.com-20130531114152-5ljhkuswwpt4kdwo
Tags: 0.8.7-1
* [314881d] Updated debian/watch
* [18ebada] Imported Upstream version 0.8.7
* [c2a1f1b] debian/rules: Provide build-arch and build-indep
* [d3036a4] Enabled Hardening Options
* [2edfb87] Refreshed patches and removed patches apllied upstream
* [ac3b953] Bump to standard versions 3.9.4
* [292c276] Remove quilt from depends

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/**************************************************************************
2
 
 Copyright:
3
 
      (C) 2008 - 2011  Alexander Shaduri <ashaduri 'at' gmail.com>
4
 
 License: See LICENSE_zlib.txt file
5
 
***************************************************************************/
6
 
 
7
 
#ifndef HZ_SYNC_POLICY_GLIB_H
8
 
#define HZ_SYNC_POLICY_GLIB_H
9
 
 
10
 
#include "hz_config.h"  // feature macros
11
 
 
12
 
#include <glib.h>
13
 
 
14
 
#include "sync.h"
15
 
 
16
 
 
17
 
// Glib-based policy.
18
 
 
19
 
 
20
 
// Note: g_static_mutex_*lock() functions may give warnings about breaking strict-aliasing rules.
21
 
// The warnings are completely harmless and visible on some versions of glib only.
22
 
// However, due to their number, I decided to implement this workaround.
23
 
 
24
 
#ifndef _WIN32
25
 
        // same as stock version, but an additional cast to (void*) is added.
26
 
        #define hz_glib_static_mutex_get_mutex(mutex) \
27
 
                ( g_thread_use_default_impl ? ((GMutex*) ((void*)((mutex)->static_mutex.pad))) : \
28
 
                g_static_mutex_get_mutex_impl_shortcut(&((mutex)->runtime_mutex)) )
29
 
 
30
 
#else
31
 
        // win32 has different definition of this macro, so default to stock version.
32
 
        #define hz_glib_static_mutex_get_mutex(mutex) g_static_mutex_get_mutex(mutex)
33
 
#endif
34
 
 
35
 
 
36
 
#define hz_glib_static_mutex_lock(mutex) \
37
 
        g_mutex_lock(hz_glib_static_mutex_get_mutex(mutex))
38
 
 
39
 
#define hz_glib_static_mutex_trylock(mutex) \
40
 
        g_mutex_trylock(hz_glib_static_mutex_get_mutex(mutex))
41
 
 
42
 
#define hz_glib_static_mutex_unlock(mutex) \
43
 
        g_mutex_unlock(hz_glib_static_mutex_get_mutex(mutex))
44
 
 
45
 
 
46
 
 
47
 
 
48
 
namespace hz {
49
 
 
50
 
 
51
 
 
52
 
class MutexGlib : public hz::noncopyable {
53
 
        public:
54
 
                typedef GStaticMutex native_type;
55
 
 
56
 
                static void native_lock(native_type& mutex)
57
 
                {
58
 
                        hz_glib_static_mutex_lock(&mutex);
59
 
                }
60
 
 
61
 
                static bool native_trylock(native_type& mutex)
62
 
                {
63
 
                        return hz_glib_static_mutex_trylock(&mutex);
64
 
                }
65
 
 
66
 
                static void native_unlock(native_type& mutex)
67
 
                {
68
 
                        hz_glib_static_mutex_unlock(&mutex);
69
 
                }
70
 
 
71
 
                MutexGlib() { g_static_mutex_init(&mutex_); }
72
 
                ~MutexGlib() { g_static_mutex_free(&mutex_); }
73
 
 
74
 
                void lock() { native_lock(mutex_); }
75
 
                bool trylock() { return native_trylock(mutex_); }
76
 
                void unlock() { native_unlock(mutex_); }
77
 
 
78
 
        private:
79
 
                GStaticMutex mutex_;  // use StaticMutex, I think it uses less heap memory
80
 
};
81
 
 
82
 
 
83
 
 
84
 
class RecMutexGlib : public hz::noncopyable {
85
 
        public:
86
 
                typedef GStaticRecMutex native_type;
87
 
 
88
 
                static void native_lock(native_type& mutex)
89
 
                {
90
 
                        g_static_rec_mutex_lock(&mutex);
91
 
                }
92
 
 
93
 
                static bool native_trylock(native_type& mutex)
94
 
                {
95
 
                        return g_static_rec_mutex_trylock(&mutex);
96
 
                }
97
 
 
98
 
                static void native_unlock(native_type& mutex)
99
 
                {
100
 
                        g_static_rec_mutex_unlock(&mutex);
101
 
                }
102
 
 
103
 
                RecMutexGlib() { g_static_rec_mutex_init(&mutex_); }
104
 
                ~RecMutexGlib() { g_static_rec_mutex_free(&mutex_); }
105
 
 
106
 
                void lock() { native_lock(mutex_); }
107
 
                bool trylock() { return native_trylock(mutex_); }
108
 
                void unlock() { native_unlock(mutex_); }
109
 
 
110
 
        private:
111
 
                GStaticRecMutex mutex_;
112
 
};
113
 
 
114
 
 
115
 
 
116
 
class RWMutexGlib : public hz::noncopyable {
117
 
        public:
118
 
                typedef GStaticRWLock native_type;
119
 
 
120
 
                static void native_lock(native_type& mutex, bool for_write = false)
121
 
                {
122
 
                        if (for_write) {
123
 
                                g_static_rw_lock_writer_lock(&mutex);
124
 
                        } else {
125
 
                                g_static_rw_lock_reader_lock(&mutex);
126
 
                        }
127
 
                }
128
 
 
129
 
                static bool native_trylock(native_type& mutex, bool for_write = false)
130
 
                {
131
 
                        return (for_write ? g_static_rw_lock_writer_trylock(&mutex) : g_static_rw_lock_reader_trylock(&mutex));
132
 
                }
133
 
 
134
 
                static void native_unlock(native_type& mutex, bool for_write = false)
135
 
                {
136
 
                        if (for_write) {
137
 
                                g_static_rw_lock_writer_unlock(&mutex);
138
 
                        } else {
139
 
                                g_static_rw_lock_reader_unlock(&mutex);
140
 
                        }
141
 
                }
142
 
 
143
 
                RWMutexGlib() { g_static_rw_lock_init(&mutex_); }
144
 
                ~RWMutexGlib() { g_static_rw_lock_free(&mutex_); }
145
 
 
146
 
                void lock(bool for_write = false) { native_lock(mutex_, for_write); }
147
 
                bool trylock(bool for_write = false) { return native_trylock(mutex_, for_write); }
148
 
                void unlock(bool for_write = false) { native_unlock(mutex_, for_write); }
149
 
 
150
 
        private:
151
 
                GStaticRWLock mutex_;
152
 
};
153
 
 
154
 
 
155
 
 
156
 
 
157
 
// Native type notes:
158
 
// MutexGlib's underlying structure is neither guaranteed to be
159
 
// recursive nor to be non-recursive.
160
 
// All these mutexes won't do anything unless gthread is initialized.
161
 
 
162
 
// Note: For this policy to work, you MUST initialize GThread system
163
 
// by calling one of the following (doesn't matter which exactly) beforehand:
164
 
// Glib::thread_init();  // glibmm
165
 
// or
166
 
// g_thread_init(NULL);  // glib
167
 
// or
168
 
// SyncPolicyGlib::init();  // sync's wrapper
169
 
 
170
 
// If you don't do it, the operations will silently do nothing.
171
 
 
172
 
 
173
 
// Glib doesn't provide any means to detect errors, so no exceptions here.
174
 
 
175
 
struct SyncPolicyGlib : public SyncScopedLockProvider<SyncPolicyGlib> {
176
 
 
177
 
        // Types:
178
 
 
179
 
        typedef MutexGlib Mutex;
180
 
        typedef Mutex::native_type NativeMutex;
181
 
 
182
 
        typedef RecMutexGlib RecMutex;
183
 
        typedef RecMutex::native_type NativeRecMutex;
184
 
 
185
 
        typedef RWMutexGlib RWMutex;
186
 
        typedef RWMutex::native_type NativeRWMutex;
187
 
 
188
 
 
189
 
        typedef GenericScopedLock<Mutex> ScopedLock;
190
 
        typedef GenericScopedTryLock<Mutex> ScopedTryLock;
191
 
 
192
 
        typedef GenericScopedLock<NativeMutex> ScopedNativeLock;
193
 
        typedef GenericScopedTryLock<NativeMutex> ScopedNativeTryLock;
194
 
 
195
 
        typedef GenericScopedLock<RecMutex> ScopedRecLock;
196
 
        typedef GenericScopedTryLock<RecMutex> ScopedRecTryLock;
197
 
 
198
 
        typedef GenericScopedLock<NativeRecMutex> ScopedNativeRecLock;
199
 
        typedef GenericScopedTryLock<NativeRecMutex> ScopedNativeRecTryLock;
200
 
 
201
 
        typedef GenericScopedRWLock<RWMutex> ScopedRWLock;
202
 
        typedef GenericScopedRWTryLock<RWMutex> ScopedRWTryLock;
203
 
 
204
 
        typedef GenericScopedRWLock<NativeRWMutex> ScopedNativeRWLock;
205
 
        typedef GenericScopedRWTryLock<NativeRWMutex> ScopedNativeRWTryLock;
206
 
 
207
 
 
208
 
        // Static methods
209
 
 
210
 
        // If threads are unavailable, this will abort.
211
 
        static bool init() { if (!g_thread_supported()) g_thread_init(NULL); return true; }
212
 
 
213
 
        static void lock(Mutex& m) { m.lock(); }
214
 
        static bool trylock(Mutex& m) { return m.trylock(); }
215
 
        static void unlock(Mutex& m) { m.unlock(); }
216
 
 
217
 
        static void lock(NativeMutex& m) { Mutex::native_lock(m); }
218
 
        static bool trylock(NativeMutex& m) { return Mutex::native_trylock(m); }
219
 
        static void unlock(NativeMutex& m) { Mutex::native_unlock(m); }
220
 
 
221
 
        static void lock(RecMutex& m) { m.lock(); }
222
 
        static bool trylock(RecMutex& m) { return m.trylock(); }
223
 
        static void unlock(RecMutex& m) { m.unlock(); }
224
 
 
225
 
        static void lock(NativeRecMutex& m) { RecMutex::native_lock(m); }
226
 
        static bool trylock(NativeRecMutex& m) { return RecMutex::native_trylock(m); }
227
 
        static void unlock(NativeRecMutex& m) { RecMutex::native_unlock(m); }
228
 
 
229
 
        static void lock(RWMutex& m, bool for_write = false) { m.lock(for_write); }
230
 
        static bool trylock(RWMutex& m, bool for_write = false) { return m.trylock(for_write); }
231
 
        static void unlock(RWMutex& m, bool for_write = false) { m.unlock(for_write); }
232
 
 
233
 
        static void lock(NativeRWMutex& m, bool for_write = false) { RWMutex::native_lock(m, for_write); }
234
 
        static bool trylock(NativeRWMutex& m, bool for_write = false) { return RWMutex::native_trylock(m, for_write); }
235
 
        static void unlock(NativeRWMutex& m, bool for_write = false) { RWMutex::native_unlock(m, for_write); }
236
 
 
237
 
};
238
 
 
239
 
 
240
 
 
241
 
// mutex -> policy
242
 
 
243
 
template<> struct SyncGetPolicy<SyncPolicyGlib::Mutex> { typedef SyncPolicyGlib type; };
244
 
template<> struct SyncGetPolicy<SyncPolicyGlib::NativeMutex> { typedef SyncPolicyGlib type; };
245
 
template<> struct SyncGetPolicy<SyncPolicyGlib::RecMutex> { typedef SyncPolicyGlib type; };
246
 
template<> struct SyncGetPolicy<SyncPolicyGlib::NativeRecMutex> { typedef SyncPolicyGlib type; };
247
 
template<> struct SyncGetPolicy<SyncPolicyGlib::RWMutex> { typedef SyncPolicyGlib type; };
248
 
template<> struct SyncGetPolicy<SyncPolicyGlib::NativeRWMutex> { typedef SyncPolicyGlib type; };
249
 
 
250
 
 
251
 
 
252
 
 
253
 
}  // ns
254
 
 
255
 
 
256
 
 
257
 
 
258
 
#endif