Update.
2000-06-20 Jes Sorensen <jes@linuxcare.com> * sysdeps/unix/sysv/linux/ia64/syscalls.list: New file. 2000-06-20 Jes Sorensen <jes@linuxcare.com> * sysdeps/unix/sysv/linux/ia64/machine-gmon.h: New file. * sysdeps/unix/sysv/linux/ia64/profil-counter.h: New file. 2000-06-20 David Mosberger-Tang <davidm@hpl.hp.com> * sysdeps/unix/sysv/linux/ia64/getpagesize.c: New file. 2000-06-20 Jes Sorensen <jes@linuxcare.com> * sysdeps/unix/sysv/linux/ia64/sys/ucontext.h: Fix typo.
This commit is contained in:
parent
1b97149de8
commit
697568d1b4
17
ChangeLog
17
ChangeLog
@ -1,3 +1,20 @@
|
|||||||
|
2000-06-20 Jes Sorensen <jes@linuxcare.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/syscalls.list: New file.
|
||||||
|
|
||||||
|
2000-06-20 Jes Sorensen <jes@linuxcare.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/machine-gmon.h: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/profil-counter.h: New file.
|
||||||
|
|
||||||
|
2000-06-20 David Mosberger-Tang <davidm@hpl.hp.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/getpagesize.c: New file.
|
||||||
|
|
||||||
|
2000-06-20 Jes Sorensen <jes@linuxcare.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/ia64/sys/ucontext.h: Fix typo.
|
||||||
|
|
||||||
2000-06-20 Ulrich Drepper <drepper@redhat.com>
|
2000-06-20 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
* locale/programs/ld-collate.c (insert_value): Now take string and
|
* locale/programs/ld-collate.c (insert_value): Now take string and
|
||||||
|
@ -1,3 +1,16 @@
|
|||||||
|
2000-06-20 Ulrich Drepper <drepper@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/bits/posix_opt.h: Define _POSIX_BARRIERS.
|
||||||
|
* sysdeps/unix/sysv/linux/i386/bits/posix_opt.h: Likewise.
|
||||||
|
|
||||||
|
* Makefile (libpthread-routines): Add barrier.
|
||||||
|
(tests): Add ex9. Add rule to build ex9.
|
||||||
|
* Versions: Export barrier functions.
|
||||||
|
* barrier.c: New file.
|
||||||
|
* Examples/ex9.c: New file.
|
||||||
|
* sysdeps/pthread/pthread.h: Add barrier data types and declarations.
|
||||||
|
* sysdeps/pthread/bits/pthreadtypes.h: Likewise.
|
||||||
|
|
||||||
2000-06-19 H.J. Lu <hjl@gnu.org>
|
2000-06-19 H.J. Lu <hjl@gnu.org>
|
||||||
|
|
||||||
* spinlock.h (HAS_COMPARE_AND_SWAP): Defined if
|
* spinlock.h (HAS_COMPARE_AND_SWAP): Defined if
|
||||||
|
94
linuxthreads/Examples/ex9.c
Normal file
94
linuxthreads/Examples/ex9.c
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/* Tests for pthread_barrier_* functions.
|
||||||
|
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||||
|
Contributed by Kaz Kylheku <kaz@ashi.footprints.net>, 2000.
|
||||||
|
|
||||||
|
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. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <error.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
#define NUM_THREADS 10
|
||||||
|
#define NUM_ITERS 500
|
||||||
|
|
||||||
|
static void *thread (void *);
|
||||||
|
static pthread_barrier_t barrier;
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
pthread_t th;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (pthread_barrier_init (&barrier, NULL, NUM_THREADS + 1) != 0)
|
||||||
|
error (EXIT_FAILURE, 0, "cannot initialize barrier");
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_THREADS; i++)
|
||||||
|
{
|
||||||
|
if (pthread_create (&th, NULL, thread, NULL) != 0)
|
||||||
|
error (EXIT_FAILURE, 0, "cannot create thread");
|
||||||
|
}
|
||||||
|
|
||||||
|
(void) thread (NULL);
|
||||||
|
/* notreached */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void *
|
||||||
|
thread (void *arg)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
pthread_t self = pthread_self ();
|
||||||
|
static pthread_t last_serial_thread;
|
||||||
|
static int linecount; /* protected by flockfile(stdout) */
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_ITERS; i++)
|
||||||
|
{
|
||||||
|
switch (pthread_barrier_wait (&barrier))
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
flockfile (stdout);
|
||||||
|
printf ("%04d: non-serial thread %lu\n", ++linecount,
|
||||||
|
(unsigned long) self);
|
||||||
|
funlockfile (stdout);
|
||||||
|
break;
|
||||||
|
case PTHREAD_BARRIER_SERIAL_THREAD:
|
||||||
|
flockfile (stdout);
|
||||||
|
printf ("%04d: serial thread %lu\n", ++linecount,
|
||||||
|
(unsigned long) self);
|
||||||
|
funlockfile (stdout);
|
||||||
|
last_serial_thread = self;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Huh? */
|
||||||
|
error (EXIT_FAILURE, 0, "unexpected return value from barrier wait");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pthread_equal (self, last_serial_thread))
|
||||||
|
{
|
||||||
|
flockfile (stdout);
|
||||||
|
printf ("%04d: last serial thread %lu terminating process\n",
|
||||||
|
++linecount, (unsigned long) self);
|
||||||
|
funlockfile (stdout);
|
||||||
|
exit (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_exit(NULL);
|
||||||
|
}
|
@ -35,10 +35,10 @@ extra-libs-others := $(extra-libs)
|
|||||||
libpthread-routines := attr cancel condvar join manager mutex ptfork \
|
libpthread-routines := attr cancel condvar join manager mutex ptfork \
|
||||||
ptlongjmp pthread signals specific errno lockfile \
|
ptlongjmp pthread signals specific errno lockfile \
|
||||||
semaphore spinlock wrapsyscall rwlock pt-machine \
|
semaphore spinlock wrapsyscall rwlock pt-machine \
|
||||||
oldsemaphore events getcpuclockid pspinlock
|
oldsemaphore events getcpuclockid pspinlock barrier
|
||||||
|
|
||||||
vpath %.c Examples
|
vpath %.c Examples
|
||||||
tests = ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8 joinrace
|
tests = ex1 ex2 ex3 ex4 ex5 ex6 ex7 ex8 ex9 joinrace
|
||||||
|
|
||||||
include ../Rules
|
include ../Rules
|
||||||
|
|
||||||
@ -68,4 +68,5 @@ $(objpfx)ex5: $(libpthread)
|
|||||||
$(objpfx)ex6: $(libpthread)
|
$(objpfx)ex6: $(libpthread)
|
||||||
$(objpfx)ex7: $(libpthread)
|
$(objpfx)ex7: $(libpthread)
|
||||||
$(objpfx)ex8: $(libpthread)
|
$(objpfx)ex8: $(libpthread)
|
||||||
|
$(objpfx)ex9: $(libpthread)
|
||||||
$(objpfx)joinrace: $(libpthread)
|
$(objpfx)joinrace: $(libpthread)
|
||||||
|
@ -135,6 +135,9 @@ libpthread {
|
|||||||
pthread_spin_destroy; pthread_spin_init; pthread_spin_lock;
|
pthread_spin_destroy; pthread_spin_init; pthread_spin_lock;
|
||||||
pthread_spin_trylock; pthread_spin_unlock;
|
pthread_spin_trylock; pthread_spin_unlock;
|
||||||
pthread_getcpuclockid;
|
pthread_getcpuclockid;
|
||||||
|
pthread_barrier_destroy; pthread_barrier_init; pthread_barrier_wait;
|
||||||
|
pthread_barrierattr_destroy; pthread_barrierattr_init;
|
||||||
|
pthread_barrierattr_getpshared; pthread_barrierattr_setpshared;
|
||||||
|
|
||||||
# Extensions.
|
# Extensions.
|
||||||
pthread_yield;
|
pthread_yield;
|
||||||
|
125
linuxthreads/barrier.c
Normal file
125
linuxthreads/barrier.c
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
/* POSIX barrier implementation for LinuxThreads.
|
||||||
|
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Kaz Kylheku <kaz@ashi.footprints.net>, 2000.
|
||||||
|
|
||||||
|
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. */
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include "pthread.h"
|
||||||
|
#include "internals.h"
|
||||||
|
#include "spinlock.h"
|
||||||
|
#include "queue.h"
|
||||||
|
#include "restart.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
pthread_barrier_wait(pthread_barrier_t *barrier)
|
||||||
|
{
|
||||||
|
pthread_descr self = thread_self();
|
||||||
|
pthread_descr temp_wake_queue, th;
|
||||||
|
int result = 0;
|
||||||
|
|
||||||
|
__pthread_lock(&barrier->__ba_lock, self);
|
||||||
|
|
||||||
|
/* If the required number of threads have achieved rendezvous... */
|
||||||
|
if (barrier->__ba_present >= barrier->__ba_required - 1)
|
||||||
|
{
|
||||||
|
/* ... then this last caller shall be the serial thread */
|
||||||
|
result = PTHREAD_BARRIER_SERIAL_THREAD;
|
||||||
|
/* Copy and clear wait queue and reset barrier. */
|
||||||
|
temp_wake_queue = barrier->__ba_waiting;
|
||||||
|
barrier->__ba_waiting = NULL;
|
||||||
|
barrier->__ba_present = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = 0;
|
||||||
|
barrier->__ba_present++;
|
||||||
|
enqueue(&barrier->__ba_waiting, self);
|
||||||
|
}
|
||||||
|
|
||||||
|
__pthread_unlock(&barrier->__ba_lock);
|
||||||
|
|
||||||
|
if (result == 0)
|
||||||
|
{
|
||||||
|
/* Non-serial threads have to suspend */
|
||||||
|
suspend(self);
|
||||||
|
/* We don't bother dealing with cancellation because the POSIX
|
||||||
|
spec for barriers doesn't mention that pthread_barrier_wait
|
||||||
|
is a cancellation point. */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Serial thread wakes up all others. */
|
||||||
|
while ((th = dequeue(&temp_wake_queue)) != NULL)
|
||||||
|
restart(th);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
pthread_barrier_init(pthread_barrier_t *barrier,
|
||||||
|
const pthread_barrierattr_t *attr,
|
||||||
|
unsigned int count)
|
||||||
|
{
|
||||||
|
if (count == 0)
|
||||||
|
return EINVAL;
|
||||||
|
|
||||||
|
__pthread_init_lock(&barrier->__ba_lock);
|
||||||
|
barrier->__ba_required = count;
|
||||||
|
barrier->__ba_present = 0;
|
||||||
|
barrier->__ba_waiting = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
pthread_barrier_destroy(pthread_barrier_t *barrier)
|
||||||
|
{
|
||||||
|
if (barrier->__ba_waiting != NULL) return EBUSY;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
pthread_barrierattr_init(pthread_barrierattr_t *attr)
|
||||||
|
{
|
||||||
|
attr->__pshared = PTHREAD_PROCESS_PRIVATE;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
pthread_barrierattr_destroy(pthread_barrierattr_t *attr)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
__pthread_barrierattr_getpshared(const pthread_barrierattr_t *attr,
|
||||||
|
int *pshared)
|
||||||
|
{
|
||||||
|
*pshared = attr->__pshared;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
pthread_barrierattr_setpshared(pthread_barrierattr_t *attr, int pshared)
|
||||||
|
{
|
||||||
|
if (pshared != PTHREAD_PROCESS_PRIVATE && pshared != PTHREAD_PROCESS_SHARED)
|
||||||
|
return EINVAL;
|
||||||
|
|
||||||
|
attr->__pshared = pshared;
|
||||||
|
return 0;
|
||||||
|
}
|
@ -118,6 +118,20 @@ typedef struct
|
|||||||
#ifdef __USE_XOPEN2K
|
#ifdef __USE_XOPEN2K
|
||||||
/* POSIX spinlock data type. */
|
/* POSIX spinlock data type. */
|
||||||
typedef volatile int pthread_spinlock_t;
|
typedef volatile int pthread_spinlock_t;
|
||||||
|
|
||||||
|
/* POSIX barrier. */
|
||||||
|
typedef struct {
|
||||||
|
struct _pthread_fastlock __ba_lock; /* Lock to guarantee mutual exclusion */
|
||||||
|
int __ba_required; /* Threads needed for completion */
|
||||||
|
int __ba_present; /* Threads waiting */
|
||||||
|
_pthread_descr __ba_waiting; /* Queue of waiting threads */
|
||||||
|
} pthread_barrier_t;
|
||||||
|
|
||||||
|
/* barrier attribute */
|
||||||
|
typedef struct {
|
||||||
|
int __pshared;
|
||||||
|
} pthread_barrierattr_t;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -109,6 +109,13 @@ enum
|
|||||||
|
|
||||||
#define PTHREAD_ONCE_INIT 0
|
#define PTHREAD_ONCE_INIT 0
|
||||||
|
|
||||||
|
/* Special constants */
|
||||||
|
|
||||||
|
#ifdef __USE_XOPEN2K
|
||||||
|
/* -1 is distinct from 0 and all errno constants */
|
||||||
|
# define PTHREAD_BARRIER_SERIAL_THREAD -1
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Cleanup buffers */
|
/* Cleanup buffers */
|
||||||
|
|
||||||
struct _pthread_cleanup_buffer
|
struct _pthread_cleanup_buffer
|
||||||
@ -414,7 +421,7 @@ extern int pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *__attr,
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __USE_XOPEN2K
|
#ifdef __USE_XOPEN2K
|
||||||
/* The IEEE Std. 10003.1j-2000 introduces functions to implement
|
/* The IEEE Std. 1003.1j-2000 introduces functions to implement
|
||||||
spinlocks. */
|
spinlocks. */
|
||||||
|
|
||||||
/* Initialize the spinlock LOCK. If PSHARED is nonzero the spinlock can
|
/* Initialize the spinlock LOCK. If PSHARED is nonzero the spinlock can
|
||||||
@ -433,6 +440,27 @@ extern int pthread_spin_trylock (pthread_spinlock_t *__lock) __THROW;
|
|||||||
|
|
||||||
/* Release spinlock LOCK. */
|
/* Release spinlock LOCK. */
|
||||||
extern int pthread_spin_unlock (pthread_spinlock_t *__lock) __THROW;
|
extern int pthread_spin_unlock (pthread_spinlock_t *__lock) __THROW;
|
||||||
|
|
||||||
|
|
||||||
|
/* Barriers are a also a new feature in 1003.1j-2000. */
|
||||||
|
|
||||||
|
extern int pthread_barrier_init (pthread_barrier_t *__barrier,
|
||||||
|
__const pthread_barrierattr_t *__attr,
|
||||||
|
unsigned int __count) __THROW;
|
||||||
|
|
||||||
|
extern int pthread_barrier_destroy (pthread_barrier_t *__barrier) __THROW;
|
||||||
|
|
||||||
|
extern int pthread_barrierattr_init (pthread_barrierattr_t *__attr) __THROW;
|
||||||
|
|
||||||
|
extern int pthread_barrierattr_destroy (pthread_barrierattr_t *__attr) __THROW;
|
||||||
|
|
||||||
|
extern int pthread_barrierattr_getpshared (__const pthread_barrierattr_t *__attr,
|
||||||
|
int *__pshared) __THROW;
|
||||||
|
|
||||||
|
extern int pthread_barrierattr_setpshared (pthread_barrierattr_t *__attr,
|
||||||
|
int __pshared) __THROW;
|
||||||
|
|
||||||
|
extern int pthread_barrier_wait (pthread_barrier_t *__barrier) __THROW;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ timer_create (clock_id, evp, timerid)
|
|||||||
#endif
|
#endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
errno = EINVAL;
|
__set_errno (EINVAL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ timer_create (clock_id, evp, timerid)
|
|||||||
|
|
||||||
if (__timer_init_failed)
|
if (__timer_init_failed)
|
||||||
{
|
{
|
||||||
errno = ENOMEM;
|
__set_errno (ENOMEM);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ timer_create (clock_id, evp, timerid)
|
|||||||
newtimer = __timer_alloc ();
|
newtimer = __timer_alloc ();
|
||||||
if (__builtin_expect (newtimer == NULL, 0))
|
if (__builtin_expect (newtimer == NULL, 0))
|
||||||
{
|
{
|
||||||
errno = EAGAIN;
|
__set_errno (EAGAIN);
|
||||||
goto unlock_bail;
|
goto unlock_bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,13 +106,13 @@ timer_create (clock_id, evp, timerid)
|
|||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! thread->exists)
|
if (! thread->exists)
|
||||||
{
|
{
|
||||||
if (__builtin_expect (__timer_thread_start (thread),
|
if (__builtin_expect (__timer_thread_start (thread),
|
||||||
1) < 0)
|
1) < 0)
|
||||||
{
|
{
|
||||||
errno = EAGAIN;
|
__set_errno (EAGAIN);
|
||||||
goto unlock_bail;
|
goto unlock_bail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -138,7 +138,7 @@ timer_create (clock_id, evp, timerid)
|
|||||||
/* Out of luck; no threads are available. */
|
/* Out of luck; no threads are available. */
|
||||||
if (__builtin_expect (thread == NULL, 0))
|
if (__builtin_expect (thread == NULL, 0))
|
||||||
{
|
{
|
||||||
errno = EAGAIN;
|
__set_errno (EAGAIN);
|
||||||
goto unlock_bail;
|
goto unlock_bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,13 +146,13 @@ timer_create (clock_id, evp, timerid)
|
|||||||
if (! thread->exists
|
if (! thread->exists
|
||||||
&& __builtin_expect (! __timer_thread_start (thread), 0))
|
&& __builtin_expect (! __timer_thread_start (thread), 0))
|
||||||
{
|
{
|
||||||
errno = EAGAIN;
|
__set_errno (EAGAIN);
|
||||||
goto unlock_bail;
|
goto unlock_bail;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
errno = EINVAL;
|
__set_errno (EINVAL);
|
||||||
goto unlock_bail;
|
goto unlock_bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,9 +36,9 @@ timer_delete (timerid)
|
|||||||
pthread_mutex_lock (&__timer_mutex);
|
pthread_mutex_lock (&__timer_mutex);
|
||||||
|
|
||||||
timer = timer_id2ptr (timerid);
|
timer = timer_id2ptr (timerid);
|
||||||
if (timer == NULL || !timer->inuse)
|
if (! timer_valid (timer))
|
||||||
/* Invalid timer ID or the timer is not in use. */
|
/* Invalid timer ID or the timer is not in use. */
|
||||||
errno = EINVAL;
|
__set_errno (EINVAL);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (timer->armed)
|
if (timer->armed)
|
||||||
@ -50,16 +50,17 @@ timer_delete (timerid)
|
|||||||
the mutex is unlocked and timer_delete is aborted. */
|
the mutex is unlocked and timer_delete is aborted. */
|
||||||
pthread_cleanup_push (__timer_mutex_cancel_handler, &__timer_mutex);
|
pthread_cleanup_push (__timer_mutex_cancel_handler, &__timer_mutex);
|
||||||
|
|
||||||
/* If timer is currently being serviced, wait for it to finish. */
|
/* If timer is currently being serviced, wait for it to finish. */
|
||||||
while (thread->current_timer == timer)
|
while (thread->current_timer == timer)
|
||||||
pthread_cond_wait (&thread->cond, &__timer_mutex);
|
pthread_cond_wait (&thread->cond, &__timer_mutex);
|
||||||
|
|
||||||
pthread_cleanup_pop (0);
|
pthread_cleanup_pop (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove timer from whatever queue it may be on and deallocate it. */
|
/* Remove timer from whatever queue it may be on and deallocate it. */
|
||||||
|
timer->inuse = TIMER_DELETED;
|
||||||
list_unlink_ip (&timer->links);
|
list_unlink_ip (&timer->links);
|
||||||
__timer_dealloc (timer);
|
timer_delref (timer);
|
||||||
retval = 0;
|
retval = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,4 +131,7 @@
|
|||||||
/* We have POSIX timers. */
|
/* We have POSIX timers. */
|
||||||
#define _POSIX_TIMERS 1
|
#define _POSIX_TIMERS 1
|
||||||
|
|
||||||
|
/* The barrier functions are available. */
|
||||||
|
#define _POSIX_BARRIERS 200912L
|
||||||
|
|
||||||
#endif /* posix_opt.h */
|
#endif /* posix_opt.h */
|
||||||
|
@ -140,4 +140,7 @@
|
|||||||
/* We have POSIX timers. */
|
/* We have POSIX timers. */
|
||||||
#define _POSIX_TIMERS 1
|
#define _POSIX_TIMERS 1
|
||||||
|
|
||||||
|
/* The barrier functions are available. */
|
||||||
|
#define _POSIX_BARRIERS 200912L
|
||||||
|
|
||||||
#endif /* posix_opt.h */
|
#endif /* posix_opt.h */
|
||||||
|
46
sysdeps/unix/sysv/linux/ia64/getpagesize.c
Normal file
46
sysdeps/unix/sysv/linux/ia64/getpagesize.c
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/* Copyright (C) 1999, 2000 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. */
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
|
||||||
|
#include <sysdep.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
|
||||||
|
/* Return the system page size. The return value will depend on how
|
||||||
|
the kernel is configured. A program must use this call to
|
||||||
|
determine the page size to ensure proper alignment for calls such
|
||||||
|
as mmap and friends. --davidm 99/11/30 */
|
||||||
|
|
||||||
|
/* If we are not a static program, this value is collected from the system
|
||||||
|
via the AT_PAGESZ auxiliary argument. If we are a static program, we
|
||||||
|
use the getpagesize system call. */
|
||||||
|
|
||||||
|
extern size_t _dl_pagesize;
|
||||||
|
|
||||||
|
extern size_t __syscall_getpagesize (void);
|
||||||
|
|
||||||
|
int
|
||||||
|
__getpagesize ()
|
||||||
|
{
|
||||||
|
if (_dl_pagesize == 0)
|
||||||
|
_dl_pagesize = INLINE_SYSCALL (getpagesize, 0);
|
||||||
|
return _dl_pagesize;
|
||||||
|
}
|
||||||
|
|
||||||
|
weak_alias (__getpagesize, getpagesize)
|
26
sysdeps/unix/sysv/linux/ia64/machine-gmon.h
Normal file
26
sysdeps/unix/sysv/linux/ia64/machine-gmon.h
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/* Machine-specific calling sequence for `mcount' profiling function. IA-64.
|
||||||
|
Copyright (C) 1995, 1996, 1997, 2000 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. */
|
||||||
|
|
||||||
|
#define _MCOUNT_DECL(from, self) \
|
||||||
|
void __mcount (u_long from, u_long self)
|
||||||
|
|
||||||
|
/* Call __mcount with our the return PC for our caller, and the return
|
||||||
|
PC our caller will return to. Empty since we use an assembly stub
|
||||||
|
instead. */
|
||||||
|
#define MCOUNT
|
27
sysdeps/unix/sysv/linux/ia64/profil-counter.h
Normal file
27
sysdeps/unix/sysv/linux/ia64/profil-counter.h
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
/* Machine-dependent SIGPROF signal handler. IA-64 version.
|
||||||
|
Copyright (C) 1996, 1997, 2000 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. */
|
||||||
|
|
||||||
|
/* In many Unix systems signal handlers are called like this
|
||||||
|
and the interrupted PC is easily findable in the `struct sigcontext'. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
profil_counter (int signr, int code, struct sigcontext *scp)
|
||||||
|
{
|
||||||
|
profil_count ((void *) scp->sc_ip);
|
||||||
|
}
|
@ -54,7 +54,7 @@ typedef struct
|
|||||||
unsigned long int ss_flags; /* Save state flags. */
|
unsigned long int ss_flags; /* Save state flags. */
|
||||||
unsigned long int br_1, br_2, br_3, br_4, br_5; /* Branch registers. */
|
unsigned long int br_1, br_2, br_3, br_4, br_5; /* Branch registers. */
|
||||||
unsigned long int p_regs; /* Predicates. */
|
unsigned long int p_regs; /* Predicates. */
|
||||||
} mcountext_;
|
} mcontext_t;
|
||||||
|
|
||||||
|
|
||||||
typedef struct ucontext
|
typedef struct ucontext
|
||||||
|
77
sysdeps/unix/sysv/linux/ia64/syscalls.list
Normal file
77
sysdeps/unix/sysv/linux/ia64/syscalls.list
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
# File name Caller Syscall name # args Strong name Weak names
|
||||||
|
|
||||||
|
umount2 - umount 2 __umount2 umount2
|
||||||
|
|
||||||
|
# Whee! 64-bit systems naturally implement llseek.
|
||||||
|
llseek EXTRA lseek 3 __llseek llseek __lseek64 lseek64
|
||||||
|
pread - pread 4 __syscall_pread __syscall_pread64 __pread pread __pread64 pread64
|
||||||
|
pwrite - pwrite 4 __syscall_pwrite __syscall_pwrite64 __pwrite pwrite __pwrite64 pwrite64
|
||||||
|
fstatfs - fstatfs 2 __fstatfs fstatfs fstatfs64
|
||||||
|
statfs - statfs 2 __statfs statfs statfs64
|
||||||
|
mmap - mmap 6 __mmap mmap __mmap64 mmap64
|
||||||
|
getpeername - getpeername 3 __getpeername getpeername
|
||||||
|
getpriority - getpriority 2 __getpriority getpriority
|
||||||
|
|
||||||
|
# semaphore and shm system calls
|
||||||
|
msgctl - msgctl 3 __msgctl msgctl
|
||||||
|
msgget - msgget 2 __msgget msgget
|
||||||
|
msgrcv - msgrcv 5 __msgrcv msgrcv
|
||||||
|
msgsnd - msgsnd 4 __msgsnd msgsnd
|
||||||
|
shmat - shmat 3 __shmat shmat
|
||||||
|
shmctl - shmctl 3 __shmctl shmctl
|
||||||
|
shmdt - shmdt 1 __shmdt shmdt
|
||||||
|
shmget - shmget 3 __shmget shmget
|
||||||
|
semop - semop 3 __semop semop
|
||||||
|
semget - semget 3 __semget semget
|
||||||
|
semctl - semctl 4 __semctl semctl
|
||||||
|
|
||||||
|
# proper socket implementations:
|
||||||
|
accept - accept 3 __libc_accept __accept accept
|
||||||
|
bind - bind 3 __bind bind
|
||||||
|
connect - connect 3 __libc_connect __connect connect
|
||||||
|
getpeername - getpeername 3 __getpeername getpeername
|
||||||
|
getsockname - getsockname 3 __getsockname getsockname
|
||||||
|
getsockopt - getsockopt 5 __getsockopt getsockopt
|
||||||
|
listen - listen 2 __listen listen
|
||||||
|
recv - recv 4 __libc_recv __recv recv
|
||||||
|
recvfrom - recvfrom 6 __libc_recvfrom __recvfrom recvfrom
|
||||||
|
recvmsg - recvmsg 3 __libc_recvmsg recvmsg
|
||||||
|
send - send 4 __libc_send __send send
|
||||||
|
sendmsg - sendmsg 3 __libc_sendmsg sendmsg
|
||||||
|
sendto - sendto 6 __libc_sendto __sendto sendto
|
||||||
|
setsockopt - setsockopt 5 __setsockopt setsockopt
|
||||||
|
socket - socket 3 __socket socket
|
||||||
|
socketpair - socketpair 4 __socketpair socketpair
|
||||||
|
|
||||||
|
# DIG-compliant access to PCI configuration space:
|
||||||
|
pciconfig_read EXTRA pciconfig_read 5 pciconfig_read
|
||||||
|
pciconfig_write EXTRA pciconfig_write 5 pciconfig_write
|
||||||
|
|
||||||
|
ptrace - ptrace 4 __ptrace ptrace
|
||||||
|
shutdown - shutdown 2 __shutdown shutdown
|
||||||
|
sysctl - _sysctl 6 __sysctl sysctl
|
||||||
|
|
||||||
|
getresuid - getresuid 3 getresuid
|
||||||
|
getresgid - getresgid 3 getresgid
|
||||||
|
|
||||||
|
rt_sigaction EXTRA rt_sigaction 4 __syscall_rt_sigaction rt_sigaction
|
||||||
|
rt_sigpending EXTRA rt_sigpending 2 __syscall_rt_sigpending rt_sigpending
|
||||||
|
rt_sigprocmask EXTRA rt_sigprocmask 4 __syscall_rt_sigprocmask rt_sigprocmask
|
||||||
|
rt_sigqueueinfo EXTRA rt_sigqueueinfo 3 __syscall_rt_sigqueueinfo rt_sigqueueinfo
|
||||||
|
rt_sigsuspend EXTRA rt_sigsuspend 2 __syscall_rt_sigsuspend rt_sigsuspend
|
||||||
|
rt_sigtimedwait EXTRA rt_sigtimedwait 4 __syscall_rt_sigtimedwait rt_sigtimedwait
|
||||||
|
|
||||||
|
# System calls with wrappers.
|
||||||
|
s_execve execve execve 3 __syscall_execve
|
||||||
|
s_getcwd getcwd getcwd 2 __syscall_getcwd getcwd
|
||||||
|
s_getdents getdents getdents 3 __syscall_getdents getdents
|
||||||
|
sys_mknod xmknod mknod 3 __syscall_mknod
|
||||||
|
sys_readv readv readv 3 __syscall_readv
|
||||||
|
sys_writev writev writev 3 __syscall_writev
|
||||||
|
s_getpagesize getpagesize getpagesize 0 __syscall_getpagesize
|
||||||
|
s_poll poll poll 3 __syscall_poll
|
||||||
|
s_reboot reboot reboot 3 __syscall_reboot
|
||||||
|
s_ustat ustat ustat 2 __syscall_ustat
|
||||||
|
s_stat xstat stat 2 __syscall_stat
|
||||||
|
s_lstat lxstat lstat 2 __syscall_lstat
|
||||||
|
s_fstat fxstat fstat 2 __syscall_fstat
|
Loading…
x
Reference in New Issue
Block a user