diff options
Diffstat (limited to 'linuxthreads')
-rw-r--r-- | linuxthreads/Makefile | 2 | ||||
-rw-r--r-- | linuxthreads/Versions | 3 | ||||
-rw-r--r-- | linuxthreads/semaphore.c | 72 | ||||
-rw-r--r-- | linuxthreads/semaphore.h | 64 | ||||
-rw-r--r-- | linuxthreads/sysdeps/alpha/bits/semaphore.h | 31 | ||||
-rw-r--r-- | linuxthreads/sysdeps/powerpc/bits/semaphore.h | 32 | ||||
-rw-r--r-- | linuxthreads/sysdeps/pthread/bits/pthreadtypes.h | 3 | ||||
-rw-r--r-- | linuxthreads/sysdeps/pthread/cmpxchg/bits/semaphore.h | 26 | ||||
-rw-r--r-- | linuxthreads/sysdeps/pthread/no-cmpxchg/bits/semaphore.h | 27 |
9 files changed, 103 insertions, 157 deletions
diff --git a/linuxthreads/Makefile b/linuxthreads/Makefile index 8cc1373..600e194 100644 --- a/linuxthreads/Makefile +++ b/linuxthreads/Makefile @@ -24,7 +24,7 @@ subdir := linuxthreads linuxthreads-version := $(shell sed -n 's/^.*$(subdir)-\([0-9.]*\).*$$/\1/p' \ Banner) -headers := pthread.h semaphore.h bits/semaphore.h +headers := pthread.h semaphore.h distribute := internals.h queue.h restart.h spinlock.h routines := weaks no-tsd diff --git a/linuxthreads/Versions b/linuxthreads/Versions index df5355f..6b95031 100644 --- a/linuxthreads/Versions +++ b/linuxthreads/Versions @@ -101,4 +101,7 @@ libpthread { __libc_current_sigrtmin; __libc_current_sigrtmax; __libc_allocate_rtsig; } + GLIBC_2.1.1 { + sem_close; sem_open; sem_unlink; + } } diff --git a/linuxthreads/semaphore.c b/linuxthreads/semaphore.c index eca68d2..1753021 100644 --- a/linuxthreads/semaphore.c +++ b/linuxthreads/semaphore.c @@ -32,9 +32,9 @@ int sem_init(sem_t *sem, int pshared, unsigned int value) errno = ENOSYS; return -1; } - __pthread_init_lock((struct _pthread_fastlock *) &sem->sem_lock); - sem->sem_value = value; - sem->sem_waiting = NULL; + __pthread_init_lock((struct _pthread_fastlock *) &sem->__sem_lock); + sem->__sem_value = value; + sem->__sem_waiting = NULL; return 0; } @@ -42,23 +42,23 @@ int sem_wait(sem_t * sem) { volatile pthread_descr self = thread_self(); - __pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, self); - if (sem->sem_value > 0) { - sem->sem_value--; - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self); + if (sem->__sem_value > 0) { + sem->__sem_value--; + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); return 0; } - enqueue(&sem->sem_waiting, self); + enqueue(&sem->__sem_waiting, self); /* Wait for sem_post or cancellation */ - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); suspend_with_cancellation(self); /* This is a cancellation point */ if (THREAD_GETMEM(self, p_canceled) && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) { /* Remove ourselves from the waiting list if we're still on it */ - __pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, self); - remove_from_queue(&sem->sem_waiting, self); - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self); + remove_from_queue(&sem->__sem_waiting, self); + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); pthread_exit(PTHREAD_CANCELED); } /* We got the semaphore */ @@ -69,15 +69,15 @@ int sem_trywait(sem_t * sem) { int retval; - __pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, NULL); - if (sem->sem_value == 0) { + __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, NULL); + if (sem->__sem_value == 0) { errno = EAGAIN; retval = -1; } else { - sem->sem_value--; + sem->__sem_value--; retval = 0; } - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); return retval; } @@ -88,19 +88,19 @@ int sem_post(sem_t * sem) struct pthread_request request; if (THREAD_GETMEM(self, p_in_sighandler) == NULL) { - __pthread_lock((struct _pthread_fastlock *) &sem->sem_lock, self); - if (sem->sem_waiting == NULL) { - if (sem->sem_value >= SEM_VALUE_MAX) { + __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self); + if (sem->__sem_waiting == NULL) { + if (sem->__sem_value >= SEM_VALUE_MAX) { /* Overflow */ errno = ERANGE; - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); return -1; } - sem->sem_value++; - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + sem->__sem_value++; + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); } else { - th = dequeue(&sem->sem_waiting); - __pthread_unlock((struct _pthread_fastlock *) &sem->sem_lock); + th = dequeue(&sem->__sem_waiting); + __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); restart(th); } } else { @@ -122,15 +122,33 @@ int sem_post(sem_t * sem) int sem_getvalue(sem_t * sem, int * sval) { - *sval = sem->sem_value; + *sval = sem->__sem_value; return 0; } int sem_destroy(sem_t * sem) { - if (sem->sem_waiting != NULL) { - errno = EBUSY; + if (sem->__sem_waiting != NULL) { + __set_errno (EBUSY); return -1; } return 0; } + +sem_t *sem_open(const char *name, int oflag, ...) +{ + __set_errno (ENOSYS); + return SEM_FAILED; +} + +int sem_close(sem_t *sem) +{ + __set_errno (ENOSYS); + return -1; +} + +int sem_unlink(const char *name) +{ + __set_errno (ENOSYS); + return -1; +} diff --git a/linuxthreads/semaphore.h b/linuxthreads/semaphore.h index fe2b451..1d5f933 100644 --- a/linuxthreads/semaphore.h +++ b/linuxthreads/semaphore.h @@ -18,24 +18,62 @@ #include <features.h> #include <sys/types.h> -#include <limits.h> +#ifndef _PTHREAD_DESCR_DEFINED +/* Thread descriptors. Needed for `sem_t' definition. */ +typedef struct _pthread_descr_struct *_pthread_descr; +# define _PTHREAD_DESCR_DEFINED +#endif -#define SEM_VALUE_MAX INT_MAX - -typedef struct { - struct { long status; int spinlock; } sem_lock; - int sem_value; - _pthread_descr sem_waiting; +/* System specific semaphore definition. */ +typedef struct +{ + struct + { + long int status; + int spinlock; + } __sem_lock; + int __sem_value; + _pthread_descr __sem_waiting; } sem_t; + + +/* Value returned if `sem_open' failed. */ +#define SEM_FAILED ((sem_t *) NULL) + +/* Maximum value the semaphore can have. */ +#define SEM_VALUE_MAX ((int) ((~0u) >> 1)) + + __BEGIN_DECLS -extern int sem_init __P((sem_t *__sem, int __pshared, unsigned int __value)); -extern int sem_destroy __P((sem_t *__sem)); -extern int sem_wait __P((sem_t *__sem)); -extern int sem_trywait __P((sem_t *__sem)); -extern int sem_post __P((sem_t *__sem)); -extern int sem_getvalue __P((sem_t *__sem, int *__sval)); +/* Initialize semaphore object SEM to VALUE. If PSHARED then share it + with other processes. */ +extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value)); + +/* Free resources associated with semaphore object SEM. */ +extern int sem_destroy __P ((sem_t *__sem)); + +/* Open a named semaphore NAME with open flaot OFLAG. */ +extern sem_t *sem_open __P ((__const char *__name, int __oflag, ...)); + +/* Close descriptor for named semaphore SEM. */ +extern int sem_close __P ((sem_t *__sem)); + +/* Remove named semaphore NAME. */ +extern int sem_unlink __P ((__const char *__name)); + +/* Wait for SEM being posted. */ +extern int sem_wait __P ((sem_t *__sem)); + +/* Test whether SEM is posted. */ +extern int sem_trywait __P ((sem_t *__sem)); + +/* Post SEM. */ +extern int sem_post __P ((sem_t *__sem)); + +/* Get current value of SEM and store it in *SVAL. */ +extern int sem_getvalue __P ((sem_t *__sem, int *__sval)); __END_DECLS diff --git a/linuxthreads/sysdeps/alpha/bits/semaphore.h b/linuxthreads/sysdeps/alpha/bits/semaphore.h deleted file mode 100644 index 323fea1..0000000 --- a/linuxthreads/sysdeps/alpha/bits/semaphore.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _SEMAPHORE_H -# error "Never include <bits/semaphore.h> directly; use <semaphore.h> instead." -#endif - - -/* Due to the implementation of the load-locked/store-conditional - instructions, we cannot pack semaphores closer than a cache line - or risk threads deadlocking on unrelated semaphores. */ - -typedef struct { - long int sem_status; - long int sem_reserved[3]; -} sem_t; diff --git a/linuxthreads/sysdeps/powerpc/bits/semaphore.h b/linuxthreads/sysdeps/powerpc/bits/semaphore.h deleted file mode 100644 index 3770eed..0000000 --- a/linuxthreads/sysdeps/powerpc/bits/semaphore.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _SEMAPHORE_H -# error "Never include <bits/semaphore.h> directly; use <semaphore.h> instead." -#endif - - -/* Due to the implementation of the load-locked/store-conditional - instructions, we cannot pack semaphores closer than a cache line - or risk threads deadlocking on unrelated semaphores. */ - -typedef struct - { - int sem_status; - int sem_reserved[7]; - } sem_t; diff --git a/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h b/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h index 04dbe35..fbb10ed 100644 --- a/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h +++ b/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h @@ -29,8 +29,11 @@ struct _pthread_fastlock int __spinlock; /* For compare-and-swap emulation */ }; +#ifndef _PTHREAD_DESCR_DEFINED /* Thread descriptors */ typedef struct _pthread_descr_struct *_pthread_descr; +# define _PTHREAD_DESCR_DEFINED +#endif /* Attributes for threads. */ diff --git a/linuxthreads/sysdeps/pthread/cmpxchg/bits/semaphore.h b/linuxthreads/sysdeps/pthread/cmpxchg/bits/semaphore.h deleted file mode 100644 index 0cdbc05..0000000 --- a/linuxthreads/sysdeps/pthread/cmpxchg/bits/semaphore.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _SEMAPHORE_H -# error "Never include <bits/semaphore.h> directly; use <semaphore.h> instead." -#endif - - -typedef struct { - long int sem_status; -} sem_t; diff --git a/linuxthreads/sysdeps/pthread/no-cmpxchg/bits/semaphore.h b/linuxthreads/sysdeps/pthread/no-cmpxchg/bits/semaphore.h deleted file mode 100644 index 4d801a2..0000000 --- a/linuxthreads/sysdeps/pthread/no-cmpxchg/bits/semaphore.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _SEMAPHORE_H -# error "Never include <bits/semaphore.h> directly; use <semaphore.h> instead." -#endif - - -typedef struct { - long int sem_status; - int sem_spinlock; -} sem_t; |