atomic ops routed via qt
[serna.git] / sfworks / common / impl / ThreadMutex.cxx
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 #include "common/common_defs.h"
31
32 #ifdef MULTI_THREADED
33 # ifdef _WIN32
34 #  define VC_EXTRALEAN
35 #  include <windows.h>
36 # else
37 /// \attention kludge to compile in pthread_mutexattr_settype prototype
38 #  ifdef linux
39 #   define _XOPEN_SOURCE 500
40 #  endif
41 #  include <pthread.h>
42 # endif // _WIN32
43 #endif // MULTI_THREADED
44
45 // For memset(), see pthread-based ThreadMutex::initialize
46 #include <string.h>
47 #include "common/ThreadMutex.h"
48
49
50 COMMON_NS_BEGIN
51
52 #ifdef MULTI_THREADED
53
54 #ifdef _WIN32
55
56 void ThreadMutex::initialize(MutexType* m)
57 {
58     ::InitializeCriticalSection(m);
59 }
60
61 void ThreadMutex::destroy(MutexType* m)
62 {
63     ::DeleteCriticalSection(m);
64 }
65
66 void ThreadMutex::lock(MutexType* m)
67 {
68     ::EnterCriticalSection(m);
69 }
70
71 void ThreadMutex::unlock(MutexType* m)
72 {
73     ::LeaveCriticalSection(m);
74 }
75
76 #else // _WIN32
77
78 void ThreadMutex::initialize(MutexType* m)
79 {
80     ::pthread_mutexattr_t mutex_attr;
81     ::pthread_mutexattr_init(&mutex_attr);
82     ::pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
83 // Solaris 8 MT programming guide states that mutex memory _must_ be
84 // initialized to zero. It can't hurt other pthreads implementations.
85     memset(m, 0, sizeof(*m));
86     ::pthread_mutex_init(m, &mutex_attr);
87     ::pthread_mutexattr_destroy(&mutex_attr);
88 }
89
90 void ThreadMutex::destroy(MutexType* m)
91 {
92     ::pthread_mutex_destroy(m);
93 }
94
95 void ThreadMutex::lock(MutexType* m)
96 {
97     ::pthread_mutex_lock(m);
98 }
99
100 void ThreadMutex::unlock(MutexType* m)
101 {
102     ::pthread_mutex_unlock(m);
103 }
104
105 #endif // _WIN32
106
107 #endif // MULTI_THREADED
108
109 COMMON_NS_END
110
111 #if !defined(INLINE_ATOMICS) && defined(NO_QT_THREADING)
112 # define INLINE_ATOMICS
113 # include "machdep/ThreadMutexAtomics.i"
114 #endif
115