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