OLD | NEW |
| (Empty) |
1 /******************************************************************** | |
2 * COPYRIGHT: | |
3 * Copyright (c) 1999-2015, International Business Machines Corporation and | |
4 * others. All Rights Reserved. | |
5 ********************************************************************/ | |
6 | |
7 #if defined(hpux) | |
8 # ifndef _INCLUDE_POSIX_SOURCE | |
9 # define _INCLUDE_POSIX_SOURCE | |
10 # endif | |
11 #endif | |
12 | |
13 /* Define __EXTENSIONS__ for Solaris and old friends in strict mode. */ | |
14 #ifndef __EXTENSIONS__ | |
15 #define __EXTENSIONS__ | |
16 #endif | |
17 | |
18 // Defines _XOPEN_SOURCE for access to POSIX functions. | |
19 // Must be before any other #includes. | |
20 #include "uposixdefs.h" | |
21 | |
22 #include "simplethread.h" | |
23 | |
24 #include "unicode/utypes.h" | |
25 #include "unicode/ustring.h" | |
26 #include "umutex.h" | |
27 #include "cmemory.h" | |
28 #include "cstring.h" | |
29 #include "uparse.h" | |
30 #include "unicode/resbund.h" | |
31 #include "unicode/udata.h" | |
32 #include "unicode/uloc.h" | |
33 #include "unicode/locid.h" | |
34 #include "putilimp.h" | |
35 #include "intltest.h" | |
36 | |
37 #include <stdio.h> | |
38 #include <string.h> | |
39 #include <ctype.h> // tolower, toupper | |
40 | |
41 #if U_PLATFORM_USES_ONLY_WIN32_API | |
42 /* Prefer native Windows APIs even if POSIX is implemented (i.e., on Cygwin)
. */ | |
43 # undef POSIX | |
44 #elif U_PLATFORM_IMPLEMENTS_POSIX | |
45 # define POSIX | |
46 #else | |
47 # undef POSIX | |
48 #endif | |
49 | |
50 /* Needed by z/OS to get usleep */ | |
51 #if U_PLATFORM == U_PF_OS390 | |
52 #define __DOT1 1 | |
53 #ifndef __UU | |
54 # define __UU | |
55 #endif | |
56 #ifndef _XPG4_2 | |
57 # define _XPG4_2 | |
58 #endif | |
59 #include <unistd.h> | |
60 #endif | |
61 | |
62 #if defined(POSIX) | |
63 #define HAVE_IMP | |
64 | |
65 #include <pthread.h> | |
66 | |
67 #if U_PLATFORM == U_PF_OS390 | |
68 #include <sys/types.h> | |
69 #endif | |
70 | |
71 #if U_PLATFORM != U_PF_OS390 | |
72 #include <signal.h> | |
73 #endif | |
74 | |
75 /* Define _XPG4_2 for Solaris and friends. */ | |
76 #ifndef _XPG4_2 | |
77 #define _XPG4_2 | |
78 #endif | |
79 | |
80 /* Define __USE_XOPEN_EXTENDED for Linux and glibc. */ | |
81 #ifndef __USE_XOPEN_EXTENDED | |
82 #define __USE_XOPEN_EXTENDED | |
83 #endif | |
84 | |
85 /* Define _INCLUDE_XOPEN_SOURCE_EXTENDED for HP/UX (11?). */ | |
86 #ifndef _INCLUDE_XOPEN_SOURCE_EXTENDED | |
87 #define _INCLUDE_XOPEN_SOURCE_EXTENDED | |
88 #endif | |
89 | |
90 #include <unistd.h> | |
91 | |
92 #endif | |
93 /* HPUX */ | |
94 #ifdef sleep | |
95 #undef sleep | |
96 #endif | |
97 | |
98 | |
99 #include "unicode/putil.h" | |
100 | |
101 /* for mthreadtest*/ | |
102 #include "unicode/numfmt.h" | |
103 #include "unicode/choicfmt.h" | |
104 #include "unicode/msgfmt.h" | |
105 #include "unicode/locid.h" | |
106 #include "unicode/ucol.h" | |
107 #include "unicode/calendar.h" | |
108 #include "ucaconf.h" | |
109 | |
110 #if U_PLATFORM_USES_ONLY_WIN32_API | |
111 #define HAVE_IMP | |
112 | |
113 # define VC_EXTRALEAN | |
114 # define WIN32_LEAN_AND_MEAN | |
115 # define NOUSER | |
116 # define NOSERVICE | |
117 # define NOIME | |
118 # define NOMCX | |
119 #include <windows.h> | |
120 #include <process.h> | |
121 | |
122 //------------------------------------------------------------------------------
----- | |
123 // | |
124 // class SimpleThread Windows Implementation | |
125 // | |
126 //------------------------------------------------------------------------------
----- | |
127 struct Win32ThreadImplementation | |
128 { | |
129 HANDLE fHandle; | |
130 unsigned int fThreadID; | |
131 }; | |
132 | |
133 | |
134 extern "C" unsigned int __stdcall SimpleThreadProc(void *arg) | |
135 { | |
136 ((SimpleThread*)arg)->run(); | |
137 return 0; | |
138 } | |
139 | |
140 SimpleThread::SimpleThread() | |
141 :fImplementation(0) | |
142 { | |
143 Win32ThreadImplementation *imp = new Win32ThreadImplementation; | |
144 imp->fHandle = 0; | |
145 fImplementation = imp; | |
146 } | |
147 | |
148 SimpleThread::~SimpleThread() | |
149 { | |
150 // Destructor. Because we start the thread running with _beginthreadex(), | |
151 // we own the Windows HANDLE for the thread and must | |
152 // close it here. | |
153 Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation
; | |
154 if (imp != 0) { | |
155 if (imp->fHandle != 0) { | |
156 CloseHandle(imp->fHandle); | |
157 imp->fHandle = 0; | |
158 } | |
159 } | |
160 delete (Win32ThreadImplementation*)fImplementation; | |
161 } | |
162 | |
163 int32_t SimpleThread::start() | |
164 { | |
165 Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation
; | |
166 if(imp->fHandle != NULL) { | |
167 // The thread appears to have already been started. | |
168 // This is probably an error on the part of our caller. | |
169 return -1; | |
170 } | |
171 | |
172 imp->fHandle = (HANDLE) _beginthreadex( | |
173 NULL, // Security | |
174 0x20000, // Stack Size | |
175 SimpleThreadProc, // Function to Run | |
176 (void *)this, // Arg List | |
177 0, // initflag. Start running, not s
uspended | |
178 &imp->fThreadID // thraddr | |
179 ); | |
180 | |
181 if (imp->fHandle == 0) { | |
182 // An error occured | |
183 int err = errno; | |
184 if (err == 0) { | |
185 err = -1; | |
186 } | |
187 return err; | |
188 } | |
189 return 0; | |
190 } | |
191 | |
192 | |
193 void SimpleThread::join() { | |
194 Win32ThreadImplementation *imp = (Win32ThreadImplementation*)fImplementation
; | |
195 if (imp->fHandle == 0) { | |
196 // No handle, thread must not be running. | |
197 return; | |
198 } | |
199 WaitForSingleObject(imp->fHandle, INFINITE); | |
200 } | |
201 | |
202 #endif | |
203 | |
204 | |
205 //------------------------------------------------------------------------------
----- | |
206 // | |
207 // class SimpleThread POSIX implementation | |
208 // | |
209 //------------------------------------------------------------------------------
----- | |
210 #if defined(POSIX) | |
211 #define HAVE_IMP | |
212 | |
213 struct PosixThreadImplementation | |
214 { | |
215 pthread_t fThread; | |
216 }; | |
217 | |
218 extern "C" void* SimpleThreadProc(void *arg) | |
219 { | |
220 // This is the code that is run in the new separate thread. | |
221 SimpleThread *This = (SimpleThread *)arg; | |
222 This->run(); | |
223 return 0; | |
224 } | |
225 | |
226 SimpleThread::SimpleThread() | |
227 { | |
228 PosixThreadImplementation *imp = new PosixThreadImplementation; | |
229 fImplementation = imp; | |
230 } | |
231 | |
232 SimpleThread::~SimpleThread() | |
233 { | |
234 PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation
; | |
235 delete imp; | |
236 fImplementation = (void *)0xdeadbeef; | |
237 } | |
238 | |
239 int32_t SimpleThread::start() | |
240 { | |
241 int32_t rc; | |
242 static pthread_attr_t attr; | |
243 static UBool attrIsInitialized = FALSE; | |
244 | |
245 PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation
; | |
246 | |
247 if (attrIsInitialized == FALSE) { | |
248 rc = pthread_attr_init(&attr); | |
249 #if U_PLATFORM == U_PF_OS390 | |
250 { | |
251 int detachstate = 0; // jdc30: detach state of zero causes | |
252 //threads created with this attr to be in | |
253 //an undetached state. An undetached | |
254 //thread will keep its resources after | |
255 //termination. | |
256 pthread_attr_setdetachstate(&attr, &detachstate); | |
257 } | |
258 #else | |
259 // pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); | |
260 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); | |
261 #endif | |
262 attrIsInitialized = TRUE; | |
263 } | |
264 rc = pthread_create(&(imp->fThread), &attr, &SimpleThreadProc, (void*)this); | |
265 | |
266 if (rc != 0) { | |
267 // some kind of error occured, the thread did not start. | |
268 } | |
269 | |
270 return rc; | |
271 } | |
272 | |
273 void SimpleThread::join() { | |
274 PosixThreadImplementation *imp = (PosixThreadImplementation*)fImplementation
; | |
275 pthread_join(imp->fThread, NULL); | |
276 } | |
277 | |
278 #endif | |
279 // end POSIX | |
280 | |
281 | |
282 #ifndef HAVE_IMP | |
283 #error No implementation for threads! Cannot test. | |
284 #endif | |
OLD | NEW |