OSDN Git Service

* store-motion.c Do not include params.h
[pf3gnuchains/gcc-fork.git] / libobjc / thr-os2.c
1 /* GNU Objective C Runtime Thread Interface - OS/2 emx Implementation
2    Copyright (C) 1996, 1997, 2009 Free Software Foundation, Inc.
3    Contributed by Thomas Baier (baier@ci.tuwien.ac.at)
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under the
8 terms of the GNU General Public License as published by the Free Software
9 Foundation; either version 3, or (at your option) any later version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
14 details.
15
16 Under Section 7 of GPL version 3, you are granted additional
17 permissions described in the GCC Runtime Library Exception, version
18 3.1, as published by the Free Software Foundation.
19
20 You should have received a copy of the GNU General Public License and
21 a copy of the GCC Runtime Library Exception along with this program;
22 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 <http://www.gnu.org/licenses/>.  */
24
25
26 #include "objc/thr.h"
27 #include "objc/runtime.h"
28
29 #define INCL_DOSSEMAPHORES
30 #define INCL_DOSPROCESS
31
32 /*
33  * conflicts with objc.h:       SEL, BOOL, id
34  * solution:  prefixing those with _OS2_ before including <os2.h>
35  */
36 #define SEL _OS2_SEL
37 #define BOOL _OS2_BOOL
38 #define id _OS2_id
39 #include <os2.h>
40 #undef id
41 #undef SEL
42 #undef BOOL
43
44 #include <stdlib.h>
45
46 /* Backend initialization functions */
47
48 /* Initialize the threads subsystem. */
49 int
50 __objc_init_thread_system(void)
51 {
52   return 0;
53 }
54
55 /* Close the threads subsystem. */
56 int
57 __objc_close_thread_system(void)
58 {
59   return 0;
60 }
61
62 /* Backend thread functions */
63
64 /* Create a new thread of execution. */
65 objc_thread_t
66 __objc_thread_detach(void (*func)(void *arg), void *arg)
67 {
68   int thread_id = 0;
69
70   if ((thread_id = _beginthread (func,NULL,32768,arg)) < 0)
71     thread_id = 0;
72   
73   return (objc_thread_t)thread_id;
74 }
75
76 /* Set the current thread's priority. */
77 int
78 __objc_thread_set_priority(int priority)
79 {
80   ULONG sys_class = 0;
81   ULONG sys_priority = 0;
82
83   /* OBJC_THREAD_INTERACTIVE_PRIORITY -> PRTYC_FOREGROUNDSERVER
84    * OBJC_THREAD_BACKGROUND_PRIORITY  -> PRTYC_REGULAR
85    * OBJC_THREAD_LOW_PRIORITY         -> PRTYC_IDLETIME */
86   
87   switch (priority) {
88   case OBJC_THREAD_INTERACTIVE_PRIORITY:
89     sys_class = PRTYC_REGULAR;
90     sys_priority = 10;
91     break;
92   default:
93   case OBJC_THREAD_BACKGROUND_PRIORITY:
94     sys_class = PRTYC_IDLETIME;
95     sys_priority = 25;
96     break;
97   case OBJC_THREAD_LOW_PRIORITY:
98     sys_class = PRTYC_IDLETIME;
99     sys_priority = 0;
100     break;
101   }
102
103   /* Change priority */
104   if (!DosSetPriority (PRTYS_THREAD,sys_class,sys_priority,*_threadid))
105     return 0;
106   else
107     return -1;
108 }
109
110 /* Return the current thread's priority. */
111 int
112 __objc_thread_get_priority(void)
113 {
114   PTIB ptib;
115   PPIB ppib;
116
117   /* get information about current thread */
118   DosGetInfoBlocks (&ptib,&ppib);
119
120   switch (ptib->tib_ptib2->tib2_ulpri)
121     {
122     case PRTYC_IDLETIME:
123     case PRTYC_REGULAR:
124     case PRTYC_TIMECRITICAL:
125     case PRTYC_FOREGROUNDSERVER:
126     default:
127       return OBJC_THREAD_INTERACTIVE_PRIORITY;
128     }
129
130   return -1;
131 }
132
133 /* Yield our process time to another thread. */
134 void
135 __objc_thread_yield(void)
136 {
137   DosSleep (0);
138 }
139
140 /* Terminate the current thread. */
141 int
142 __objc_thread_exit(void)
143 {
144   /* terminate the thread, NEVER use DosExit () */
145   _endthread ();
146
147   /* Failed if we reached here */
148   return -1;
149 }
150
151 /* Returns an integer value which uniquely describes a thread. */
152 objc_thread_t
153 __objc_thread_id(void)
154 {
155   return (objc_thread_t) *_threadid;
156 }
157
158 /* Sets the thread's local storage pointer. */
159 int
160 __objc_thread_set_data(void *value)
161 {
162   *_threadstore () = value;
163
164   return 0;
165 }
166
167 /* Returns the thread's local storage pointer. */
168 void *
169 __objc_thread_get_data(void)
170 {
171   return *_threadstore ();
172 }
173
174 /* Backend mutex functions */
175
176 /* Allocate a mutex. */
177 int
178 __objc_mutex_allocate(objc_mutex_t mutex)
179 {
180   if (DosCreateMutexSem (NULL, (HMTX)(&(mutex->backend)),0L,0) > 0)
181     return -1;
182   else
183     return 0;
184 }
185
186 /* Deallocate a mutex. */
187 int
188 __objc_mutex_deallocate(objc_mutex_t mutex)
189 {
190   DosCloseMutexSem ((HMTX)(mutex->backend));
191   return 0;
192 }
193
194 /* Grab a lock on a mutex. */
195 int
196 __objc_mutex_lock(objc_mutex_t mutex)
197 {
198   if (DosRequestMutexSem ((HMTX)(mutex->backend),-1L) != 0)
199     return -1;
200   else
201     return 0;
202 }
203
204 /* Try to grab a lock on a mutex. */
205 int
206 __objc_mutex_trylock(objc_mutex_t mutex)
207 {
208   if (DosRequestMutexSem ((HMTX)(mutex->backend),0L) != 0)
209     return -1;
210   else
211     return 0;
212 }
213
214 /* Unlock the mutex */
215 int
216 __objc_mutex_unlock(objc_mutex_t mutex)
217 {
218   if (DosReleaseMutexSem((HMTX)(mutex->backend)) != 0)
219     return -1;
220   else
221     return 0;
222 }
223
224 /* Backend condition mutex functions */
225
226 /* Allocate a condition. */
227 int
228 __objc_condition_allocate(objc_condition_t condition)
229 {
230   /* Unimplemented. */
231   return -1;
232 }
233
234 /* Deallocate a condition. */
235 int
236 __objc_condition_deallocate(objc_condition_t condition)
237 {
238   /* Unimplemented. */
239   return -1;
240 }
241
242 /* Wait on the condition */
243 int
244 __objc_condition_wait(objc_condition_t condition, objc_mutex_t mutex)
245 {
246   /* Unimplemented. */
247   return -1;
248 }
249
250 /* Wake up all threads waiting on this condition. */
251 int
252 __objc_condition_broadcast(objc_condition_t condition)
253 {
254   /* Unimplemented. */
255   return -1;
256 }
257
258 /* Wake up one thread waiting on this condition. */
259 int
260 __objc_condition_signal(objc_condition_t condition)
261 {
262   /* Unimplemented. */
263   return -1;
264 }
265
266 /* End of File */