summaryrefslogtreecommitdiffstats
path: root/contrib/gcc/gthr-posix.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/gcc/gthr-posix.h')
-rw-r--r--contrib/gcc/gthr-posix.h212
1 files changed, 112 insertions, 100 deletions
diff --git a/contrib/gcc/gthr-posix.h b/contrib/gcc/gthr-posix.h
index 58bfcb3..9149e64 100644
--- a/contrib/gcc/gthr-posix.h
+++ b/contrib/gcc/gthr-posix.h
@@ -35,6 +35,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#define __GTHREADS 1
#include <pthread.h>
+#include <unistd.h>
typedef pthread_key_t __gthread_key_t;
typedef pthread_once_t __gthread_once_t;
@@ -52,12 +53,12 @@ typedef pthread_mutex_t __gthread_mutex_t;
#pragma weak pthread_setspecific
#pragma weak pthread_create
-#pragma weak pthread_mutex_lock
-#pragma weak pthread_mutex_trylock
-#pragma weak pthread_mutex_unlock
+#pragma weak pthread_mutex_lock
+#pragma weak pthread_mutex_trylock
+#pragma weak pthread_mutex_unlock
#ifdef _LIBOBJC
-/* Objective C. */
+/* Objective-C. */
#pragma weak pthread_cond_broadcast
#pragma weak pthread_cond_destroy
#pragma weak pthread_cond_init
@@ -67,15 +68,21 @@ typedef pthread_mutex_t __gthread_mutex_t;
#pragma weak pthread_mutex_init
#pragma weak pthread_mutex_destroy
#pragma weak pthread_self
+/* These really should be protected by _POSIX_PRIORITY_SCHEDULING, but
+ we use them inside a _POSIX_THREAD_PRIORITY_SCHEDULING block. */
+#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
#pragma weak sched_get_priority_max
#pragma weak sched_get_priority_min
+#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */
#pragma weak sched_yield
#pragma weak pthread_attr_destroy
#pragma weak pthread_attr_init
#pragma weak pthread_attr_setdetachstate
+#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
#pragma weak pthread_getschedparam
#pragma weak pthread_setschedparam
-#endif
+#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */
+#endif /* _LIBOBJC */
static inline int
__gthread_active_p (void)
@@ -114,21 +121,21 @@ static void *thread_local_storage = NULL;
/* Initialize the threads subsystem. */
static inline int
-__gthread_objc_init_thread_system(void)
+__gthread_objc_init_thread_system (void)
{
if (__gthread_active_p ())
{
/* Initialize the thread storage key */
- if (pthread_key_create(&_objc_thread_storage, NULL) == 0)
- {
- /* The normal default detach state for threads is
- * PTHREAD_CREATE_JOINABLE which causes threads to not die
- * when you think they should. */
- if (pthread_attr_init(&_objc_thread_attribs) == 0
- && pthread_attr_setdetachstate(&_objc_thread_attribs,
- PTHREAD_CREATE_DETACHED) == 0)
- return 0;
- }
+ if (pthread_key_create (&_objc_thread_storage, NULL) == 0)
+ {
+ /* The normal default detach state for threads is
+ * PTHREAD_CREATE_JOINABLE which causes threads to not die
+ * when you think they should. */
+ if (pthread_attr_init (&_objc_thread_attribs) == 0
+ && pthread_attr_setdetachstate (&_objc_thread_attribs,
+ PTHREAD_CREATE_DETACHED) == 0)
+ return 0;
+ }
}
return -1;
@@ -136,11 +143,11 @@ __gthread_objc_init_thread_system(void)
/* Close the threads subsystem. */
static inline int
-__gthread_objc_close_thread_system(void)
+__gthread_objc_close_thread_system (void)
{
if (__gthread_active_p ()
- && pthread_key_delete(_objc_thread_storage) == 0
- && pthread_attr_destroy(&_objc_thread_attribs) == 0)
+ && pthread_key_delete (_objc_thread_storage) == 0
+ && pthread_attr_destroy (&_objc_thread_attribs) == 0)
return 0;
return -1;
@@ -150,93 +157,98 @@ __gthread_objc_close_thread_system(void)
/* Create a new thread of execution. */
static inline objc_thread_t
-__gthread_objc_thread_detach(void (*func)(void *), void *arg)
+__gthread_objc_thread_detach (void (*func)(void *), void *arg)
{
objc_thread_t thread_id;
pthread_t new_thread_handle;
if (!__gthread_active_p ())
return NULL;
-
- if ( !(pthread_create(&new_thread_handle, NULL, (void *)func, arg)) )
+
+ if (!(pthread_create (&new_thread_handle, NULL, (void *) func, arg)))
thread_id = (objc_thread_t) new_thread_handle;
else
thread_id = NULL;
-
+
return thread_id;
}
/* Set the current thread's priority. */
static inline int
-__gthread_objc_thread_set_priority(int priority)
+__gthread_objc_thread_set_priority (int priority)
{
- if (!__gthread_active_p())
- return -1;
- else {
- pthread_t thread_id = pthread_self();
- int policy;
- struct sched_param params;
- int priority_min, priority_max;
-
- if (pthread_getschedparam(thread_id, &policy, &params) == 0)
- {
- if ((priority_max = sched_get_priority_max(policy)) != 0)
- return -1;
-
- if ((priority_min = sched_get_priority_min(policy)) != 0)
- return -1;
-
- if (priority > priority_max)
- priority = priority_max;
- else if (priority < priority_min)
- priority = priority_min;
- params.sched_priority = priority;
-
- /*
- * The solaris 7 and several other man pages incorrectly state that
- * this should be a pointer to policy but pthread.h is universally
- * at odds with this.
- */
- if (pthread_setschedparam(thread_id, policy, &params) == 0)
- return 0;
- }
+ if (!__gthread_active_p ())
return -1;
- }
+ else
+ {
+#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
+ pthread_t thread_id = pthread_self ();
+ int policy;
+ struct sched_param params;
+ int priority_min, priority_max;
+
+ if (pthread_getschedparam (thread_id, &policy, &params) == 0)
+ {
+ if ((priority_max = sched_get_priority_max (policy)) == -1)
+ return -1;
+
+ if ((priority_min = sched_get_priority_min (policy)) == -1)
+ return -1;
+
+ if (priority > priority_max)
+ priority = priority_max;
+ else if (priority < priority_min)
+ priority = priority_min;
+ params.sched_priority = priority;
+
+ /*
+ * The solaris 7 and several other man pages incorrectly state that
+ * this should be a pointer to policy but pthread.h is universally
+ * at odds with this.
+ */
+ if (pthread_setschedparam (thread_id, policy, &params) == 0)
+ return 0;
+ }
+#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */
+ return -1;
+ }
}
/* Return the current thread's priority. */
static inline int
-__gthread_objc_thread_get_priority(void)
+__gthread_objc_thread_get_priority (void)
{
+#ifdef _POSIX_THREAD_PRIORITY_SCHEDULING
if (__gthread_active_p ())
{
int policy;
struct sched_param params;
- if (pthread_getschedparam(pthread_self(), &policy, &params) == 0)
- return params.sched_priority;
+ if (pthread_getschedparam (pthread_self (), &policy, &params) == 0)
+ return params.sched_priority;
else
- return -1;
+ return -1;
}
else
+#endif /* _POSIX_THREAD_PRIORITY_SCHEDULING */
return OBJC_THREAD_INTERACTIVE_PRIORITY;
}
/* Yield our process time to another thread. */
static inline void
-__gthread_objc_thread_yield(void)
+__gthread_objc_thread_yield (void)
{
if (__gthread_active_p ())
- sched_yield();
+ sched_yield ();
}
/* Terminate the current thread. */
static inline int
-__gthread_objc_thread_exit(void)
+__gthread_objc_thread_exit (void)
{
if (__gthread_active_p ())
/* exit the thread */
- pthread_exit(&__objc_thread_exit_status);
+ pthread_exit (&__objc_thread_exit_status);
/* Failed if we reached here */
return -1;
@@ -244,20 +256,20 @@ __gthread_objc_thread_exit(void)
/* Returns an integer value which uniquely describes a thread. */
static inline objc_thread_t
-__gthread_objc_thread_id(void)
+__gthread_objc_thread_id (void)
{
if (__gthread_active_p ())
- return (objc_thread_t) pthread_self();
+ return (objc_thread_t) pthread_self ();
else
return (objc_thread_t) 1;
}
/* Sets the thread's local storage pointer. */
static inline int
-__gthread_objc_thread_set_data(void *value)
+__gthread_objc_thread_set_data (void *value)
{
if (__gthread_active_p ())
- return pthread_setspecific(_objc_thread_storage, value);
+ return pthread_setspecific (_objc_thread_storage, value);
else
{
thread_local_storage = value;
@@ -267,10 +279,10 @@ __gthread_objc_thread_set_data(void *value)
/* Returns the thread's local storage pointer. */
static inline void *
-__gthread_objc_thread_get_data(void)
+__gthread_objc_thread_get_data (void)
{
if (__gthread_active_p ())
- return pthread_getspecific(_objc_thread_storage);
+ return pthread_getspecific (_objc_thread_storage);
else
return thread_local_storage;
}
@@ -279,15 +291,15 @@ __gthread_objc_thread_get_data(void)
/* Allocate a mutex. */
static inline int
-__gthread_objc_mutex_allocate(objc_mutex_t mutex)
+__gthread_objc_mutex_allocate (objc_mutex_t mutex)
{
if (__gthread_active_p ())
{
- mutex->backend = objc_malloc(sizeof(pthread_mutex_t));
+ mutex->backend = objc_malloc (sizeof (pthread_mutex_t));
- if (pthread_mutex_init((pthread_mutex_t *)mutex->backend, NULL))
+ if (pthread_mutex_init ((pthread_mutex_t *) mutex->backend, NULL))
{
- objc_free(mutex->backend);
+ objc_free (mutex->backend);
mutex->backend = NULL;
return -1;
}
@@ -298,7 +310,7 @@ __gthread_objc_mutex_allocate(objc_mutex_t mutex)
/* Deallocate a mutex. */
static inline int
-__gthread_objc_mutex_deallocate(objc_mutex_t mutex)
+__gthread_objc_mutex_deallocate (objc_mutex_t mutex)
{
if (__gthread_active_p ())
{
@@ -311,16 +323,16 @@ __gthread_objc_mutex_deallocate(objc_mutex_t mutex)
do
{
- count = pthread_mutex_unlock((pthread_mutex_t *)mutex->backend);
+ count = pthread_mutex_unlock ((pthread_mutex_t *) mutex->backend);
if (count < 0)
return -1;
}
while (count);
- if (pthread_mutex_destroy((pthread_mutex_t *)mutex->backend))
+ if (pthread_mutex_destroy ((pthread_mutex_t *) mutex->backend))
return -1;
- objc_free(mutex->backend);
+ objc_free (mutex->backend);
mutex->backend = NULL;
}
return 0;
@@ -328,10 +340,10 @@ __gthread_objc_mutex_deallocate(objc_mutex_t mutex)
/* Grab a lock on a mutex. */
static inline int
-__gthread_objc_mutex_lock(objc_mutex_t mutex)
+__gthread_objc_mutex_lock (objc_mutex_t mutex)
{
- if (__gthread_active_p ()
- && pthread_mutex_lock((pthread_mutex_t *)mutex->backend) != 0)
+ if (__gthread_active_p ()
+ && pthread_mutex_lock ((pthread_mutex_t *) mutex->backend) != 0)
{
return -1;
}
@@ -341,10 +353,10 @@ __gthread_objc_mutex_lock(objc_mutex_t mutex)
/* Try to grab a lock on a mutex. */
static inline int
-__gthread_objc_mutex_trylock(objc_mutex_t mutex)
+__gthread_objc_mutex_trylock (objc_mutex_t mutex)
{
- if (__gthread_active_p ()
- && pthread_mutex_trylock((pthread_mutex_t *)mutex->backend) != 0)
+ if (__gthread_active_p ()
+ && pthread_mutex_trylock ((pthread_mutex_t *) mutex->backend) != 0)
{
return -1;
}
@@ -354,10 +366,10 @@ __gthread_objc_mutex_trylock(objc_mutex_t mutex)
/* Unlock the mutex */
static inline int
-__gthread_objc_mutex_unlock(objc_mutex_t mutex)
+__gthread_objc_mutex_unlock (objc_mutex_t mutex)
{
- if (__gthread_active_p ()
- && pthread_mutex_unlock((pthread_mutex_t *)mutex->backend) != 0)
+ if (__gthread_active_p ()
+ && pthread_mutex_unlock ((pthread_mutex_t *) mutex->backend) != 0)
{
return -1;
}
@@ -369,15 +381,15 @@ __gthread_objc_mutex_unlock(objc_mutex_t mutex)
/* Allocate a condition. */
static inline int
-__gthread_objc_condition_allocate(objc_condition_t condition)
+__gthread_objc_condition_allocate (objc_condition_t condition)
{
if (__gthread_active_p ())
{
- condition->backend = objc_malloc(sizeof(pthread_cond_t));
+ condition->backend = objc_malloc (sizeof (pthread_cond_t));
- if (pthread_cond_init((pthread_cond_t *)condition->backend, NULL))
+ if (pthread_cond_init ((pthread_cond_t *) condition->backend, NULL))
{
- objc_free(condition->backend);
+ objc_free (condition->backend);
condition->backend = NULL;
return -1;
}
@@ -388,14 +400,14 @@ __gthread_objc_condition_allocate(objc_condition_t condition)
/* Deallocate a condition. */
static inline int
-__gthread_objc_condition_deallocate(objc_condition_t condition)
+__gthread_objc_condition_deallocate (objc_condition_t condition)
{
if (__gthread_active_p ())
{
- if (pthread_cond_destroy((pthread_cond_t *)condition->backend))
+ if (pthread_cond_destroy ((pthread_cond_t *) condition->backend))
return -1;
- objc_free(condition->backend);
+ objc_free (condition->backend);
condition->backend = NULL;
}
return 0;
@@ -403,31 +415,31 @@ __gthread_objc_condition_deallocate(objc_condition_t condition)
/* Wait on the condition */
static inline int
-__gthread_objc_condition_wait(objc_condition_t condition, objc_mutex_t mutex)
+__gthread_objc_condition_wait (objc_condition_t condition, objc_mutex_t mutex)
{
if (__gthread_active_p ())
- return pthread_cond_wait((pthread_cond_t *)condition->backend,
- (pthread_mutex_t *)mutex->backend);
+ return pthread_cond_wait ((pthread_cond_t *) condition->backend,
+ (pthread_mutex_t *) mutex->backend);
else
return 0;
}
/* Wake up all threads waiting on this condition. */
static inline int
-__gthread_objc_condition_broadcast(objc_condition_t condition)
+__gthread_objc_condition_broadcast (objc_condition_t condition)
{
if (__gthread_active_p ())
- return pthread_cond_broadcast((pthread_cond_t *)condition->backend);
+ return pthread_cond_broadcast ((pthread_cond_t *) condition->backend);
else
return 0;
}
/* Wake up one thread waiting on this condition. */
static inline int
-__gthread_objc_condition_signal(objc_condition_t condition)
+__gthread_objc_condition_signal (objc_condition_t condition)
{
if (__gthread_active_p ())
- return pthread_cond_signal((pthread_cond_t *)condition->backend);
+ return pthread_cond_signal ((pthread_cond_t *) condition->backend);
else
return 0;
}
OpenPOWER on IntegriCloud