1/* Threads compatibility routines for libgcc2 and libobjc. */ 2/* Compile this one with gcc. */ 3/* Copyright (C) 1997, 1999, 2000, 2004, 2008, 2009 4 Free Software Foundation, Inc. 5 6This file is part of GCC. 7 8GCC is free software; you can redistribute it and/or modify it under 9the terms of the GNU General Public License as published by the Free 10Software Foundation; either version 3, or (at your option) any later 11version. 12 13GCC is distributed in the hope that it will be useful, but WITHOUT ANY 14WARRANTY; without even the implied warranty of MERCHANTABILITY or 15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 16for more details. 17 18Under Section 7 of GPL version 3, you are granted additional 19permissions described in the GCC Runtime Library Exception, version 203.1, as published by the Free Software Foundation. 21 22You should have received a copy of the GNU General Public License and 23a copy of the GCC Runtime Library Exception along with this program; 24see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 25<http://www.gnu.org/licenses/>. */ 26 27#ifndef _GLIBCXX_GCC_GTHR_SINGLE_H 28#define _GLIBCXX_GCC_GTHR_SINGLE_H 29 30/* Just provide compatibility for mutex handling. */ 31 32typedef int __gthread_key_t; 33typedef int __gthread_once_t; 34typedef int __gthread_mutex_t; 35typedef int __gthread_recursive_mutex_t; 36 37#define __GTHREAD_ONCE_INIT 0 38#define __GTHREAD_MUTEX_INIT 0 39#define __GTHREAD_RECURSIVE_MUTEX_INIT 0 40 41#define _GLIBCXX_UNUSED __attribute__((unused)) 42 43#ifdef _LIBOBJC 44 45/* Thread local storage for a single thread */ 46static void *thread_local_storage = NULL; 47 48/* Backend initialization functions */ 49 50/* Initialize the threads subsystem. */ 51static inline int 52__gthread_objc_init_thread_system (void) 53{ 54 /* No thread support available */ 55 return -1; 56} 57 58/* Close the threads subsystem. */ 59static inline int 60__gthread_objc_close_thread_system (void) 61{ 62 /* No thread support available */ 63 return -1; 64} 65 66/* Backend thread functions */ 67 68/* Create a new thread of execution. */ 69static inline objc_thread_t 70__gthread_objc_thread_detach (void (* func)(void *), void * arg _GLIBCXX_UNUSED) 71{ 72 /* No thread support available */ 73 return NULL; 74} 75 76/* Set the current thread's priority. */ 77static inline int 78__gthread_objc_thread_set_priority (int priority _GLIBCXX_UNUSED) 79{ 80 /* No thread support available */ 81 return -1; 82} 83 84/* Return the current thread's priority. */ 85static inline int 86__gthread_objc_thread_get_priority (void) 87{ 88 return OBJC_THREAD_INTERACTIVE_PRIORITY; 89} 90 91/* Yield our process time to another thread. */ 92static inline void 93__gthread_objc_thread_yield (void) 94{ 95 return; 96} 97 98/* Terminate the current thread. */ 99static inline int 100__gthread_objc_thread_exit (void) 101{ 102 /* No thread support available */ 103 /* Should we really exit the program */ 104 /* exit (&__objc_thread_exit_status); */ 105 return -1; 106} 107 108/* Returns an integer value which uniquely describes a thread. */ 109static inline objc_thread_t 110__gthread_objc_thread_id (void) 111{ 112 /* No thread support, use 1. */ 113 return (objc_thread_t) 1; 114} 115 116/* Sets the thread's local storage pointer. */ 117static inline int 118__gthread_objc_thread_set_data (void *value) 119{ 120 thread_local_storage = value; 121 return 0; 122} 123 124/* Returns the thread's local storage pointer. */ 125static inline void * 126__gthread_objc_thread_get_data (void) 127{ 128 return thread_local_storage; 129} 130 131/* Backend mutex functions */ 132 133/* Allocate a mutex. */ 134static inline int 135__gthread_objc_mutex_allocate (objc_mutex_t mutex _GLIBCXX_UNUSED) 136{ 137 return 0; 138} 139 140/* Deallocate a mutex. */ 141static inline int 142__gthread_objc_mutex_deallocate (objc_mutex_t mutex _GLIBCXX_UNUSED) 143{ 144 return 0; 145} 146 147/* Grab a lock on a mutex. */ 148static inline int 149__gthread_objc_mutex_lock (objc_mutex_t mutex _GLIBCXX_UNUSED) 150{ 151 /* There can only be one thread, so we always get the lock */ 152 return 0; 153} 154 155/* Try to grab a lock on a mutex. */ 156static inline int 157__gthread_objc_mutex_trylock (objc_mutex_t mutex _GLIBCXX_UNUSED) 158{ 159 /* There can only be one thread, so we always get the lock */ 160 return 0; 161} 162 163/* Unlock the mutex */ 164static inline int 165__gthread_objc_mutex_unlock (objc_mutex_t mutex _GLIBCXX_UNUSED) 166{ 167 return 0; 168} 169 170/* Backend condition mutex functions */ 171 172/* Allocate a condition. */ 173static inline int 174__gthread_objc_condition_allocate (objc_condition_t condition _GLIBCXX_UNUSED) 175{ 176 return 0; 177} 178 179/* Deallocate a condition. */ 180static inline int 181__gthread_objc_condition_deallocate (objc_condition_t condition _GLIBCXX_UNUSED) 182{ 183 return 0; 184} 185 186/* Wait on the condition */ 187static inline int 188__gthread_objc_condition_wait (objc_condition_t condition _GLIBCXX_UNUSED, 189 objc_mutex_t mutex _GLIBCXX_UNUSED) 190{ 191 return 0; 192} 193 194/* Wake up all threads waiting on this condition. */ 195static inline int 196__gthread_objc_condition_broadcast (objc_condition_t condition _GLIBCXX_UNUSED) 197{ 198 return 0; 199} 200 201/* Wake up one thread waiting on this condition. */ 202static inline int 203__gthread_objc_condition_signal (objc_condition_t condition _GLIBCXX_UNUSED) 204{ 205 return 0; 206} 207 208#else /* _LIBOBJC */ 209 210static inline int 211__gthread_active_p (void) 212{ 213 return 0; 214} 215 216static inline int 217__gthread_once (__gthread_once_t *__once _GLIBCXX_UNUSED, void (*__func) (void) _GLIBCXX_UNUSED) 218{ 219 return 0; 220} 221 222static inline int _GLIBCXX_UNUSED 223__gthread_key_create (__gthread_key_t *__key _GLIBCXX_UNUSED, void (*__func) (void *) _GLIBCXX_UNUSED) 224{ 225 return 0; 226} 227 228static int _GLIBCXX_UNUSED 229__gthread_key_delete (__gthread_key_t __key _GLIBCXX_UNUSED) 230{ 231 return 0; 232} 233 234static inline void * 235__gthread_getspecific (__gthread_key_t __key _GLIBCXX_UNUSED) 236{ 237 return 0; 238} 239 240static inline int 241__gthread_setspecific (__gthread_key_t __key _GLIBCXX_UNUSED, const void *__v _GLIBCXX_UNUSED) 242{ 243 return 0; 244} 245 246static inline int 247__gthread_mutex_destroy (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) 248{ 249 return 0; 250} 251 252static inline int 253__gthread_mutex_lock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) 254{ 255 return 0; 256} 257 258static inline int 259__gthread_mutex_trylock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) 260{ 261 return 0; 262} 263 264static inline int 265__gthread_mutex_unlock (__gthread_mutex_t *__mutex _GLIBCXX_UNUSED) 266{ 267 return 0; 268} 269 270static inline int 271__gthread_recursive_mutex_lock (__gthread_recursive_mutex_t *__mutex) 272{ 273 return __gthread_mutex_lock (__mutex); 274} 275 276static inline int 277__gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *__mutex) 278{ 279 return __gthread_mutex_trylock (__mutex); 280} 281 282static inline int 283__gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *__mutex) 284{ 285 return __gthread_mutex_unlock (__mutex); 286} 287 288#endif /* _LIBOBJC */ 289 290#undef _GLIBCXX_UNUSED 291 292#endif /* ! _GLIBCXX_GCC_GTHR_SINGLE_H */ 293