atomic ops routed via qt
[serna.git] / sfworks / common / ThreadMutex.h
1 // 
2 // Copyright(c) 2009 Syntext, Inc. All Rights Reserved.
3 // Contact: info@syntext.com, http://www.syntext.com
4 // 
5 // This file is part of Syntext Serna XML Editor.
6 // 
7 // COMMERCIAL USAGE
8 // Licensees holding valid Syntext Serna commercial licenses may use this file
9 // in accordance with the Syntext Serna Commercial License Agreement provided
10 // with the software, or, alternatively, in accorance with the terms contained
11 // in a written agreement between you and Syntext, Inc.
12 // 
13 // GNU GENERAL PUBLIC LICENSE USAGE
14 // Alternatively, this file may be used under the terms of the GNU General 
15 // Public License versions 2.0 or 3.0 as published by the Free Software 
16 // Foundation and appearing in the file LICENSE.GPL included in the packaging 
17 // of this file. In addition, as a special exception, Syntext, Inc. gives you
18 // certain additional rights, which are described in the Syntext, Inc. GPL 
19 // Exception for Syntext Serna Free Edition, included in the file 
20 // GPL_EXCEPTION.txt in this package.
21 // 
22 // You should have received a copy of appropriate licenses along with this 
23 // package. If not, see <http://www.syntext.com/legal/>. If you are unsure
24 // which license is appropriate for your use, please contact the sales 
25 // department at sales@syntext.com.
26 // 
27 // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28 // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29 // 
30 /*! \file
31      This file contains (machine-dependent) definitions of
32      primitive mutex locks. They are not intended for general
33      use, and used for parametrization of threading policies
34      defined in ThreadingPolicies.h
35  */
36 #ifndef THREAD_MUTEX_H_
37 #define THREAD_MUTEX_H_
38
39 #if defined(_WIN32) && !defined (MULTI_THREADED)
40 # error Under win32 you must define MULTI_THREADED!!!
41 #endif
42
43 #include "common/common_defs.h"
44 #include "common/common_types.h"
45
46 #include <QBasicAtomicInt>
47
48 #ifdef MULTI_THREADED
49 # ifdef _WIN32
50 #  define VC_EXTRALEAN
51 #  include <windows.h>
52 # else // _WIN32
53 #  include <pthread.h>
54 # endif // _WIN32
55 #endif // MULTI_THREADED
56
57 #if defined(MUTEX_DEBUG) && defined(MULTI_THREADED)
58 # error MUTEX_DEBUG with MULTI_THREADED makes no sense
59 #endif
60
61 COMMON_NS_BEGIN
62
63
64 /*! A null mutex (no multithreading)
65  */
66 class COMMON_EXPIMP NullThreadMutex {
67 public:
68 #ifndef MUTEX_DEBUG
69     typedef EmptyStruct MutexType;
70 #else
71     typedef NullThreadMutex MutexType;
72 #endif
73
74     typedef int32 IntType;
75     typedef int32 VolatileIntType;
76
77 #ifndef MUTEX_DEBUG
78     static void initialize(MutexType*) {}
79     static void destroy(MutexType*) {}
80     static void lock(MutexType*) {}
81     static void unlock(MutexType*) {}
82 #else // MUTEX_DEBUG
83     static void initialize(MutexType* m)
84     {
85         m->locked_ = false; m->initialized_ = true;
86     }
87     static void destroy(MutexType* m)
88     {
89         assert(m->initialized_); m->initialized_ = false;
90     }
91     static void lock(MutexType* m)
92     {
93        assert(m->initialized_); assert(!m->locked_); m->locked_ = true;
94     }
95     static void unlock(MutexType* m)
96     {
97         assert(m->initialized_); assert(m->locked_); m->locked_ = false;
98     }
99 #endif // MUTEX_DEBUG
100 #ifdef MUTEX_DEBUG
101 private:
102     bool locked_;
103     bool initialized_;
104 #endif // MUTEX_DEBUG
105 };
106
107 #ifdef MULTI_THREADED
108 /*! Non-recursive thread mutex
109  */
110 class COMMON_EXPIMP ThreadMutex {
111 public:
112     typedef int32 IntType;
113 # ifdef _WIN32
114     // Win32 critical sections
115     typedef CRITICAL_SECTION MutexType;
116 # else
117     // posix threads mutexes
118     typedef ::pthread_mutex_t MutexType;
119 # endif
120
121     static void initialize(MutexType*);
122     static void destroy(MutexType*);
123     static void lock(MutexType*);
124     static void unlock(MutexType*);
125 };
126
127 #else // MULTI_THREADED
128
129 class COMMON_EXPIMP ThreadMutex : public NullThreadMutex {};
130
131 #endif // MULTI_THREADED
132
133 COMMON_NS_END
134
135 #endif // THREAD_MUTEX_H_