GDAL

- Main Page
- Related Pages
- Classes
- Files
- Download
- Issue Tracker

- File List
- File Members

cpl_multiproc.h
1 /**********************************************************************
2 * $Id$
3 *
4 * Project: CPL - Common Portability Library
5 * Purpose: CPL Multi-Threading, and process handling portability functions.
6 * Author: Frank Warmerdam, warmerdam@pobox.com
7 *
8 **********************************************************************
9 * Copyright (c) 2002, Frank Warmerdam
10 * Copyright (c) 2008-2013, Even Rouault <even dot rouault at mines-paris dot org>
11 *
12 * Permission is hereby granted, free of charge, to any person obtaining a
13 * copy of this software and associated documentation files (the "Software"),
14 * to deal in the Software without restriction, including without limitation
15 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16 * and/or sell copies of the Software, and to permit persons to whom the
17 * Software is furnished to do so, subject to the following conditions:
18 *
19 * The above copyright notice and this permission notice shall be included
20 * in all copies or substantial portions of the Software.
21 *
22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28 * DEALINGS IN THE SOFTWARE.
29 ****************************************************************************/
30
31 #ifndef CPL_MULTIPROC_H_INCLUDED_
32 #define CPL_MULTIPROC_H_INCLUDED_
33
34 #include "cpl_port.h"
35
36 /*
37 ** There are three primary implementations of the multi-process support
38 ** controlled by one of CPL_MULTIPROC_WIN32, CPL_MULTIPROC_PTHREAD or
39 ** CPL_MULTIPROC_STUB being defined. If none are defined, the stub
40 ** implementation will be used.
41 */
42
43 #if defined(WIN32) && !defined(CPL_MULTIPROC_STUB)
44 # define CPL_MULTIPROC_WIN32
45 /* MinGW can have pthread support, so disable it to avoid issues */
46 /* in cpl_multiproc.cpp */
47 # undef CPL_MULTIPROC_PTHREAD
48 #endif
49
50 #if !defined(CPL_MULTIPROC_WIN32) && !defined(CPL_MULTIPROC_PTHREAD) \
51 && !defined(CPL_MULTIPROC_STUB) && !defined(CPL_MULTIPROC_NONE)
52 # define CPL_MULTIPROC_STUB
53 #endif
54
55 CPL_C_START
56
57 typedef void (*CPLThreadFunc)(void *);
58
59 void CPL_DLL *CPLLockFile( const char *pszPath, double dfWaitInSeconds );
60 void CPL_DLL CPLUnlockFile( void *hLock );
61
62 #ifdef DEBUG
63 typedef struct _CPLMutex CPLMutex;
64 typedef struct _CPLCond CPLCond;
65 typedef struct _CPLJoinableThread CPLJoinableThread;
66 #else
67 #define CPLMutex void
68 #define CPLCond void
69 #define CPLJoinableThread void
70 #endif
71
72 /* Options for CPLCreateMutexEx() and CPLCreateOrAcquireMutexEx() */
73 #define CPL_MUTEX_RECURSIVE 0
74 #define CPL_MUTEX_ADAPTIVE 1
75 #define CPL_MUTEX_REGULAR 2
76
77 CPLMutex CPL_DLL *CPLCreateMutex( void ); /* returned acquired */
78 CPLMutex CPL_DLL *CPLCreateMutexEx( int nOptions ); /* returned acquired */
79 int CPL_DLL CPLCreateOrAcquireMutex( CPLMutex **, double dfWaitInSeconds );
80 int CPL_DLL CPLCreateOrAcquireMutexEx( CPLMutex **, double dfWaitInSeconds, int nOptions );
81 int CPL_DLL CPLAcquireMutex( CPLMutex *hMutex, double dfWaitInSeconds );
82 void CPL_DLL CPLReleaseMutex( CPLMutex *hMutex );
83 void CPL_DLL CPLDestroyMutex( CPLMutex *hMutex );
84 void CPL_DLL CPLCleanupMasterMutex( void );
85
86 CPLCond CPL_DLL *CPLCreateCond( void );
87 void CPL_DLL CPLCondWait( CPLCond *hCond, CPLMutex* hMutex );
88 void CPL_DLL CPLCondSignal( CPLCond *hCond );
89 void CPL_DLL CPLCondBroadcast( CPLCond *hCond );
90 void CPL_DLL CPLDestroyCond( CPLCond *hCond );
91
93 GIntBig CPL_DLL CPLGetPID( void );
94 int CPL_DLL CPLGetCurrentProcessID( void );
95 int CPL_DLL CPLCreateThread( CPLThreadFunc pfnMain, void *pArg );
96 CPLJoinableThread CPL_DLL* CPLCreateJoinableThread( CPLThreadFunc pfnMain, void *pArg );
97 void CPL_DLL CPLJoinThread(CPLJoinableThread* hJoinableThread);
98 void CPL_DLL CPLSleep( double dfWaitInSeconds );
99
100 const char CPL_DLL *CPLGetThreadingModel( void );
101
102 int CPL_DLL CPLGetNumCPUs( void );
103
104 typedef struct _CPLLock CPLLock;
105
106 /* Currently LOCK_ADAPTIVE_MUTEX is Linux-only and LOCK_SPIN only available */
107 /* on systems with pthread_spinlock API (so not MacOsX). If a requested type */
108 /* isn't available, it fallbacks to LOCK_RECURSIVE_MUTEX */
109 typedef enum
110 {
111 LOCK_RECURSIVE_MUTEX,
112 LOCK_ADAPTIVE_MUTEX,
113 LOCK_SPIN
114 } CPLLockType;
115
116 CPLLock CPL_DLL *CPLCreateLock( CPLLockType eType ); /* returned NON acquired */
117 int CPL_DLL CPLCreateOrAcquireLock( CPLLock**, CPLLockType eType );
118 int CPL_DLL CPLAcquireLock( CPLLock* );
119 void CPL_DLL CPLReleaseLock( CPLLock* );
120 void CPL_DLL CPLDestroyLock( CPLLock* );
121 void CPL_DLL CPLLockSetDebugPerf( CPLLock*, int bEnableIn ); /* only available on x86/x86_64 with GCC for now */
122
123 CPL_C_END
124
125 #if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)
126
127 /* Instantiates the mutex if not already done. The parameter x should be a (void**). */
128 #define CPLMutexHolderD(x) CPLMutexHolder oHolder(x,1000.0,__FILE__,__LINE__);
129
130 /* Instantiates the mutex with options if not already done. */
131 /* The parameter x should be a (void**). */
132 #define CPLMutexHolderExD(x, nOptions) CPLMutexHolder oHolder(x,1000.0,__FILE__,__LINE__,nOptions);
133
134 /* This variant assumes the mutex has already been created. If not, it will */
135 /* be a no-op. The parameter x should be a (void*) */
136 #define CPLMutexHolderOptionalLockD(x) CPLMutexHolder oHolder(x,1000.0,__FILE__,__LINE__);
137
139 class CPL_DLL CPLMutexHolder
140 {
141 private:
142 CPLMutex *hMutex = nullptr;
143 // Only used for debugging.
144 const char *pszFile = nullptr;
145 int nLine = 0;
146
147 CPL_DISALLOW_COPY_ASSIGN(CPLMutexHolder)
148
149 public:
150
152 explicit CPLMutexHolder( CPLMutex **phMutex, double dfWaitInSeconds = 1000.0,
153 const char *pszFile = __FILE__,
154 int nLine = __LINE__,
155 int nOptions = CPL_MUTEX_RECURSIVE);
156
159 explicit CPLMutexHolder( CPLMutex* hMutex, double dfWaitInSeconds = 1000.0,
160 const char *pszFile = __FILE__,
161 int nLine = __LINE__ );
162
163 ~CPLMutexHolder();
164 };
165
166 /* Instantiates the lock if not already done. The parameter x should be a (CPLLock**). */
167 #define CPLLockHolderD(x, eType) CPLLockHolder oHolder(x,eType,__FILE__,__LINE__);
168
169 /* This variant assumes the lock has already been created. If not, it will */
170 /* be a no-op. The parameter should be (CPLLock*) */
171 #define CPLLockHolderOptionalLockD(x) CPLLockHolder oHolder(x,__FILE__,__LINE__);
172
174 class CPL_DLL CPLLockHolder
175 {
176 private:
177 CPLLock *hLock = nullptr;
178 const char *pszFile = nullptr;
179 int nLine = 0;
180
181 CPL_DISALLOW_COPY_ASSIGN(CPLLockHolder)
182
183 public:
184
186 CPLLockHolder( CPLLock **phSpin, CPLLockType eType,
187 const char *pszFile = __FILE__,
188 int nLine = __LINE__);
189
192 explicit CPLLockHolder( CPLLock* hSpin,
193 const char *pszFile = __FILE__,
194 int nLine = __LINE__ );
195
196 ~CPLLockHolder();
197 };
198
199 #endif /* def __cplusplus */
200
201 /* -------------------------------------------------------------------- */
202 /* Thread local storage. */
203 /* -------------------------------------------------------------------- */
204
205 #define CTLS_RLBUFFERINFO 1 /* cpl_conv.cpp */
206 #define CTLS_WIN32_COND 2 /* cpl_multiproc.cpp */
207 #define CTLS_CSVTABLEPTR 3 /* cpl_csv.cpp */
208 #define CTLS_CSVDEFAULTFILENAME 4 /* cpl_csv.cpp */
209 #define CTLS_ERRORCONTEXT 5 /* cpl_error.cpp */
210 /* 6: unused */
211 #define CTLS_PATHBUF 7 /* cpl_path.cpp */
212 #define CTLS_ABSTRACTARCHIVE_SPLIT 8 /* cpl_vsil_abstract_archive.cpp */
213 #define CTLS_UNUSED4 9
214 #define CTLS_CPLSPRINTF 10 /* cpl_string.h */
215 #define CTLS_RESPONSIBLEPID 11 /* gdaldataset.cpp */
216 #define CTLS_VERSIONINFO 12 /* gdal_misc.cpp */
217 #define CTLS_VERSIONINFO_LICENCE 13 /* gdal_misc.cpp */
218 #define CTLS_CONFIGOPTIONS 14 /* cpl_conv.cpp */
219 #define CTLS_FINDFILE 15 /* cpl_findfile.cpp */
220 #define CTLS_VSIERRORCONTEXT 16 /* cpl_vsi_error.cpp */
221 #define CTLS_ERRORHANDLERACTIVEDATA 17 /* cpl_error.cpp */
222
223 #define CTLS_MAX 32
224
225 CPL_C_START
226 void CPL_DLL * CPLGetTLS( int nIndex );
227 void CPL_DLL * CPLGetTLSEx( int nIndex, int* pbMemoryErrorOccurred );
228 void CPL_DLL CPLSetTLS( int nIndex, void *pData, int bFreeOnExit );
229
230 /* Warning : the CPLTLSFreeFunc must not in any case directly or indirectly */
231 /* use or fetch any TLS data, or a terminating thread will hang ! */
232 typedef void (*CPLTLSFreeFunc)( void* pData );
233 void CPL_DLL CPLSetTLSWithFreeFunc( int nIndex, void *pData, CPLTLSFreeFunc pfnFree );
234 void CPL_DLL CPLSetTLSWithFreeFuncEx( int nIndex, void *pData, CPLTLSFreeFunc pfnFree, int* pbMemoryErrorOccurred );
235
236 void CPL_DLL CPLCleanupTLS( void );
237 CPL_C_END
238
239 #endif /* CPL_MULTIPROC_H_INCLUDED_ */
CPLMutexHolder
Object to hold a mutex.
Definition: cpl_multiproc.h:139
cpl_port.h
Core portability definitions for CPL.
CPL_C_START
#define CPL_C_START
Macro to start a block of C symbols.
Definition: cpl_port.h:337
CPLLockHolder
Object to hold a lock.
Definition: cpl_multiproc.h:174
CPL_C_END
#define CPL_C_END
Macro to end a block of C symbols.
Definition: cpl_port.h:339
GIntBig
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition: cpl_port.h:248
CPL_DISALLOW_COPY_ASSIGN
#define CPL_DISALLOW_COPY_ASSIGN(ClassName)
Helper to remove the copy and assignment constructors so that the compiler will not generate the defa...
Definition: cpl_port.h:989

Generated for GDAL by 1.8.8.