1 karl 1.13 //%2006////////////////////////////////////////////////////////////////////////
|
2 sage 1.1 //
|
3 karl 1.10 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.7 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.10 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.11 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.13 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 sage 1.1 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
15 sage 1.2 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
18 sage 1.1 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 karl 1.13 //
|
21 sage 1.2 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
|
22 sage 1.1 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
24 sage 1.2 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
27 sage 1.1 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 // Author: Markus Mueller (sedgewick_de@yahoo.de)
33 //
34 // Modified By: Mike Day (mdday@us.ibm.com)
|
35 r.kieninger 1.12 // Robert Kieninger, IBM (kieningr@de.ibm.com)
|
36 sage 1.1 //
37 //%/////////////////////////////////////////////////////////////////////////////
38
|
39 sage 1.2 #ifndef IPC_ZOS_include
40 #define IPC_ZOS_include
|
41 sage 1.1
42 //#include <sched.h>
43 //#include <semaphore.h>
44 #include <pthread.h>
45 #include <signal.h>
46 #include <errno.h>
47 #include <sys/time.h>
48 #include <time.h>
49 //#include <sys/timex.h>
50 #include <unistd.h>
|
51 r.kieninger 1.12 #include <stdio.h>
|
52 sage 1.1
53 #define SEM_VALUE_MAX 0xffffffff
54
|
55 r.kieninger 1.12 #define UNLOCKED_VALUE 0
56 #define LOCKED_VALUE 1
|
57 sage 1.1
58 PEGASUS_NAMESPACE_BEGIN
59
60 //typedef sem_t PEGASUS_SEMAPHORE_TYPE;
61 //typedef pthread_t PEGASUS_THREAD_TYPE;
|
62 sage 1.2
|
63 sage 1.1 typedef PEGASUS_UINT64 PEGASUS_THREAD_TYPE;
64 typedef pthread_mutex_t PEGASUS_MUTEX_TYPE;
65
66 typedef struct {
67 Uint32 waiters;
68 pthread_mutex_t mutex;
69 pthread_cond_t cond;
70 PEGASUS_THREAD_TYPE owner;
71 } PEGASUS_SEM_HANDLE ;
72
73 typedef struct {
74 pthread_mutex_t mut;
75 pthread_mutexattr_t mutatt;
76 PEGASUS_THREAD_TYPE owner;
77 } PEGASUS_MUTEX_HANDLE ;
78
|
79 r.kieninger 1.12 // !!!!!! needs to be changed to support spin_lock like behaviour
|
80 sage 1.2 typedef PEGASUS_MUTEX_HANDLE PEGASUS_CRIT_TYPE;
|
81 r.kieninger 1.12 //typedef cs_t PEGASUS_CRIT_TYPE;
82 #define PEGASUS_ATOMIC_INT_NATIVE
83 // define the _rep type for AtomicInt
84 typedef cs_t PEGASUS_ATOMIC_TYPE;
|
85 sage 1.2
|
86 sage 1.1 struct _pthread_cleanup_buffer {
87 void (*__routine) (void *); /* Function to call. */
88 void *__arg; /* Its argument. */
89 int __canceltype; /* Saved cancellation type. */
90 struct _pthread_cleanup_buffer *__prev; /* Chaining of cleanup functions.*/
91 };
92 typedef struct _pthread_cleanup_buffer PEGASUS_CLEANUP_HANDLE;
93
|
94 sage 1.2 //#define PEGASUS_THREAD_CDECL __cdecl
95 #define PEGASUS_THREAD_CDECL
96
|
97 sage 1.1 typedef void *PEGASUS_THREAD_RETURN;
98
99 typedef struct {
100 PEGASUS_THREAD_TYPE thid;
101 pthread_attr_t thatt;
102 } PEGASUS_THREAD_HANDLE ;
103
104 //-----------------------------------------------------------------
105 /// Conditionals to support native or generic Conditional Semaphore
106 //-----------------------------------------------------------------
107
|
108 kumpf 1.8 #define PEGASUS_CONDITIONAL_NATIVE
|
109 sage 1.1
110 typedef pthread_cond_t PEGASUS_COND_TYPE;
111
112 typedef struct {
113 pthread_cond_t cond;
114 PEGASUS_THREAD_TYPE owner;
115 } PEGASUS_COND_HANDLE;
116
117 //-----------------------------------------------------------------
118 /// Conditionals to support native or generic atomic variables
119 //-----------------------------------------------------------------
120
121
122 //-----------------------------------------------------------------
123 /// Conditionals to support native or generic read/write semaphores
124 //-----------------------------------------------------------------
125
|
126 kumpf 1.8 #define PEGASUS_READWRITE_NATIVE
|
127 sage 1.1
|
128 sage 1.2 typedef struct {
129 pthread_rwlock_t rwlock;
130 PEGASUS_THREAD_TYPE owner;
131 } PEGASUS_RWLOCK_HANDLE;
|
132 sage 1.1
133
134 inline void pegasus_yield(void)
135 {
136 pthread_yield(NULL);
137 }
138
|
139 sage 1.2 // pthreads cancellation calls
|
140 sage 1.1 inline void disable_cancel(void)
141 {
142 pthread_setintr(PTHREAD_INTR_DISABLE);
143 }
144
145 inline void enable_cancel(void)
146 {
147 pthread_setintr(PTHREAD_INTR_ENABLE);
148 }
149
150 inline void pegasus_sleep(int msec)
151 {
|
152 marek 1.9 int seconds;
153 int microsecs = msec * 1000; /* convert from milliseconds to microseconds */
154
155 if (microsecs < 1000000)
156 {
157 usleep(microsecs/2);
158 pthread_testintr();
159 usleep(microsecs/2);
160
161 }
162 else
163 {
164 // sleep for loop seconds
165 seconds = microsecs / 1000000;
166 sleep(seconds);
167 // Usleep the remaining time
168 if ((seconds*1000000) < microsecs)
169 usleep(microsecs - (seconds*1000000));
170 }
|
171 sage 1.1 }
172
173 inline void init_crit(PEGASUS_CRIT_TYPE *crit)
174 {
|
175 sage 1.2 pthread_mutex_init(&(crit->mut), NULL);
|
176 sage 1.1 }
177
178 inline void enter_crit(PEGASUS_CRIT_TYPE *crit)
179 {
|
180 sage 1.2 pthread_mutex_lock(&(crit->mut));
|
181 sage 1.1 }
182
183 inline void try_crit(PEGASUS_CRIT_TYPE *crit)
184 {
|
185 sage 1.2 pthread_mutex_trylock(&(crit->mut));
|
186 sage 1.1 }
187
188 inline void exit_crit(PEGASUS_CRIT_TYPE *crit)
189 {
|
190 sage 1.2 pthread_mutex_unlock(&(crit->mut));
|
191 sage 1.1 }
192
193 inline void destroy_crit(PEGASUS_CRIT_TYPE *crit)
194 {
|
195 sage 1.2 pthread_mutexattr_destroy(&(crit->mutatt));
|
196 sage 1.1 }
197
198 inline static int pegasus_gettimeofday(struct timeval *tv)
199 {
200 return gettimeofday(tv,NULL);
201 }
|
202 sage 1.2
|
203 sage 1.1 inline void exit_thread(PEGASUS_THREAD_RETURN rc)
204 {
205 pthread_exit(rc);
206 }
207
|
208 sage 1.2 inline PEGASUS_THREAD_TYPE pegasus_thread_self(void)
209 {
|
210 sage 1.1 pthread_t pt = pthread_self();
211 return (* ((PEGASUS_THREAD_TYPE *) &pt));
212 }
213
|
214 chuck 1.5 // l10n start
215 typedef pthread_key_t PEGASUS_THREAD_KEY_TYPE;
216
217 inline Uint32 pegasus_key_create(PEGASUS_THREAD_KEY_TYPE * key)
218 {
|
219 r.kieninger 1.12 // Note: a destructor is not supported
|
220 chuck 1.5 // (because not supported on Windows (?))
221 return pthread_key_create(key, NULL);
|
222 r.kieninger 1.12 }
|
223 chuck 1.5
224 inline Uint32 pegasus_key_delete(PEGASUS_THREAD_KEY_TYPE key)
225 {
|
226 marek 1.6 return 0;
|
227 r.kieninger 1.12 }
|
228 chuck 1.5
229 inline void * pegasus_get_thread_specific(PEGASUS_THREAD_KEY_TYPE key)
230 {
|
231 marek 1.6 return pthread_getspecific_d8_np(key);
|
232 r.kieninger 1.12 }
|
233 chuck 1.5
234 inline Uint32 pegasus_set_thread_specific(PEGASUS_THREAD_KEY_TYPE key,
235 void * value)
236 {
237 return pthread_setspecific(key, value);
|
238 r.kieninger 1.12 }
|
239 chuck 1.5 // l10n end
240
|
241 sage 1.1 inline void destroy_thread(PEGASUS_THREAD_TYPE th, PEGASUS_THREAD_RETURN rc)
242 {
243 pthread_cancel(*(pthread_t *) &th);
244
245 }
246
247 PEGASUS_NAMESPACE_END
248
249 #endif // IPCzOSInclude
|