Apama  10.0.0.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
sag_connectivity_threading.h
Go to the documentation of this file.
1 /*
2  * Title: sag_connectivity_threading.hpp
3  * Description: A cross-platform threading implementation for old compilers
4  * $Copyright (c) 2015-2016 Software AG, Darmstadt, Germany and/or Software AG USA Inc., Reston, VA, USA, and/or its subsidiaries and/or its affiliates and/or their licensors.$
5  * Use, reproduction, transfer, publication or disclosure is prohibited except as specifically provided for in your License Agreement with Software AG
6  * @Version: $Id: sag_connectivity_threading.h 278320 2016-03-30 13:42:31Z pgou $
7  */
8 
55 #ifndef _SAG_CONNECTIVITY_THREADS_HPP_
56 #define _SAG_CONNECTIVITY_THREADS_HPP_
57 
58 #if defined(_WIN32) || defined(__WIN32) || defined(WIN32)
59 
60 // Windows implementation using CriticalSections and _beginthreadex
61 
62 #include <stdarg.h>
63 #include <windef.h>
64 #include <winbase.h>
65 #include <process.h>
66 #include <io.h>
67 
69 #define SAG_MUTEX_LOCK(m) EnterCriticalSection(&m)
70 
71 #define SAG_MUTEX_UNLOCK(m) LeaveCriticalSection(&m)
72 
73 #define SAG_MUTEX_INIT(m) InitializeCriticalSection(&m)
74 
75 #define SAG_MUTEX_DESTROY(m) DeleteCriticalSection(&m)
76 
81 #define SAG_MUTEX_T CRITICAL_SECTION
82 
84 #define SAG_SEMA_WAIT(s) WaitForSingleObject(s, INFINITE)
85 
86 #define SAG_SEMA_POST(s) ReleaseSemaphore(s, 1, NULL)
87 
88 #define SAG_SEMA_INIT(s) s = CreateSemaphore(NULL, 0, 0x7FFFFFFF, NULL)
89 
90 #define SAG_SEMA_DESTROY(s) CloseHandle(s)
91 
97 #define SAG_SEMA_T HANDLE
98 
104 #define SAG_THREAD_CREATE(id, func, params) (!(id = (HANDLE)_beginthreadex(NULL, 0, func, params, 0, NULL)))
105 
106 #define SAG_THREAD_JOIN(id) WaitForSingleObject(id, INFINITE)
107 
108 #define SAG_THREAD_RETURN return 0;
109 
110 #define SAG_THREAD_T HANDLE
111 
112 #define SAG_THREAD_RET_T unsigned int __stdcall
113 
114 #else // defined(_WIN32) || defined(__WIN32) || defined(WIN32)
115 
116 // Unix implementation using pthreads
117 
118 #include <pthread.h>
119 #include <semaphore.h>
120 #include <unistd.h>
121 #include <signal.h>
122 
123 
125 #define SAG_MUTEX_LOCK(m) pthread_mutex_lock(&m)
126 
127 #define SAG_MUTEX_UNLOCK(m) pthread_mutex_unlock(&m)
128 
129 #define SAG_MUTEX_INIT(m) pthread_mutex_init(&m, NULL)
130 
131 #define SAG_MUTEX_DESTROY(m) pthread_mutex_destroy(&m)
132 
138 #define SAG_MUTEX_T pthread_mutex_t
139 
141 #define SAG_SEMA_WAIT(s) {while (sem_wait(&s));}
142 
143 #define SAG_SEMA_POST(s) sem_post(&s)
144 
145 #define SAG_SEMA_INIT(s) sem_init(&s, 0, 0)
146 
147 #define SAG_SEMA_DESTROY(s) sem_destroy(&s)
148 
154 #define SAG_SEMA_T sem_t
155 
161 #define SAG_THREAD_CREATE(id, func, params) pthread_create(& id, NULL, func, params)
162 
163 #define SAG_THREAD_JOIN(id) pthread_join(id, NULL)
164 
165 #define SAG_THREAD_RETURN return NULL;
166 
167 #define SAG_THREAD_T pthread_t
168 
169 #define SAG_THREAD_RET_T void*
170 
171 
172 #endif // (else) defined(_WIN32) || defined(__WIN32) || defined(WIN32)
173 
174 #ifdef __cplusplus
175 
176 #include <stdexcept>
177 
178 namespace com {
179 namespace softwareag {
180 namespace connectivity {
181 
195 {
196 public:
199  :mx(mx), locked(false)
200  {
201  lock();
202  }
203 
206  {
207  if (locked)
208  unlock();
209  }
210 
212  void lock()
213  {
214  if (locked) throw std::runtime_error("Cannot lock a SAG_MUTEX_T that is already locked");
215  locked = true;
216  SAG_MUTEX_LOCK(mx);
217  }
219  void unlock()
220  {
221  if (!locked) throw std::runtime_error("Cannot unlock a SAG_MUTEX_T that is already unlocked");
222  locked = false;
223  SAG_MUTEX_UNLOCK(mx);
224  }
225 private:
227  SAG_LOCK_GUARD(const SAG_LOCK_GUARD &other);
231  SAG_LOCK_GUARD& operator=(const SAG_LOCK_GUARD &other);
233  SAG_LOCK_GUARD& operator=(SAG_LOCK_GUARD &&other);
234 
236  SAG_MUTEX_T &mx;
238  bool locked;
239 };
240 
241 }}} // com.softwareag.connectivity
242 
243 #endif // __cplusplus
244 
245 #endif // _SAG_CONNECTIVITY_THREADS_HPP_
#define SAG_MUTEX_LOCK(m)
Lock a mutex.
Definition: sag_connectivity_threading.h:125
SAG_LOCK_GUARD(SAG_MUTEX_T &mx)
Create a SAG_LOG_GUARD for a particular mutex.
Definition: sag_connectivity_threading.h:198
Definition: sag_connectivity_threading.h:178
A simple RAII wrapper for SAG_MUTEX_T that locks the specified mutex in its constructor, and guarantees that it will be unlocked when this object goes out of scope unless it has been unlocked already by that point.
Definition: sag_connectivity_threading.h:194
void lock()
Locks the mutex (throws if the mutex is already locked by this lock guard).
Definition: sag_connectivity_threading.h:212
#define SAG_MUTEX_T
A helper that provides cross-platform mutex functionality for use on old compilers.
Definition: sag_connectivity_threading.h:138
void unlock()
Unlocks the mutex (throws if the mutex is already unlocked by this lock guard).
Definition: sag_connectivity_threading.h:219
~SAG_LOCK_GUARD()
Destroy this lock guard.
Definition: sag_connectivity_threading.h:205
#define SAG_MUTEX_UNLOCK(m)
Unlock a mutex.
Definition: sag_connectivity_threading.h:127