* posix/sched.h: Change prototypes of sched_getaffinity and
	sched_setaffinity.  Define CPU_SET, CPU_CLR, CPU_ISSET, and CPU_ZERO.
	* sysdeps/generic/sched_getaffinity.c: Adjust definition.
	* sysdeps/generic/sched_setaffinity.c: Likewise.
	* sysdeps/generic/bits/sched.h: Define __CPU_SETSIZE, __NCPUBITS,
	__CPUELT, __CPUMASK, cpu_set_t, __cpu_mask, __CPU_ZERO, __CPU_SET,
	__CPU_CLR, and __CPU_ISSET.
	* sysdeps/unix/sysv/linux/bits/sched.h: Likewise.
	* sysdeps/unix/sysv/linux/sched_getaffinity.c: New file.
	* sysdeps/unix/sysv/linux/sched_setaffinity.c: New file.

	* include/atomic.h (atomic_exchange_acq): Renamed from atomic_exchange.
	(atomic_exchange_rel): New #define.
	* sysdeps/ia64/bits/atomic.h: Likewise.
	* sysdeps/i386/i486/bits/atomic.h (atomic_exchange_acq): Renamed from
	atomic_exchange.
	* sysdeps/m68k/m68020/bits/atomic.h: Likewise.
	* sysdeps/powerpc/bits/atomic.h: Likewise.
	* sysdeps/sparc/sparc32/sparcv9/bits/atomic.h: Likewise.
	* sysdeps/sparc/sparc64/bits/atomic.h: Likewise.
	* sysdeps/x86_64/bits/atomic.h: Likewise.
	* csu/tst-atomic.c: Use atomic_exchange_acq instead of atomic_exchange.
This commit is contained in:
Ulrich Drepper 2003-05-10 05:36:37 +00:00
parent 880867a475
commit 949ec76407
28 changed files with 480 additions and 77 deletions

View File

@ -1,5 +1,28 @@
2003-05-09 Ulrich Drepper <drepper@redhat.com> 2003-05-09 Ulrich Drepper <drepper@redhat.com>
* posix/sched.h: Change prototypes of sched_getaffinity and
sched_setaffinity. Define CPU_SET, CPU_CLR, CPU_ISSET, and CPU_ZERO.
* sysdeps/generic/sched_getaffinity.c: Adjust definition.
* sysdeps/generic/sched_setaffinity.c: Likewise.
* sysdeps/generic/bits/sched.h: Define __CPU_SETSIZE, __NCPUBITS,
__CPUELT, __CPUMASK, cpu_set_t, __cpu_mask, __CPU_ZERO, __CPU_SET,
__CPU_CLR, and __CPU_ISSET.
* sysdeps/unix/sysv/linux/bits/sched.h: Likewise.
* sysdeps/unix/sysv/linux/sched_getaffinity.c: New file.
* sysdeps/unix/sysv/linux/sched_setaffinity.c: New file.
* include/atomic.h (atomic_exchange_acq): Renamed from atomic_exchange.
(atomic_exchange_rel): New #define.
* sysdeps/ia64/bits/atomic.h: Likewise.
* sysdeps/i386/i486/bits/atomic.h (atomic_exchange_acq): Renamed from
atomic_exchange.
* sysdeps/m68k/m68020/bits/atomic.h: Likewise.
* sysdeps/powerpc/bits/atomic.h: Likewise.
* sysdeps/sparc/sparc32/sparcv9/bits/atomic.h: Likewise.
* sysdeps/sparc/sparc64/bits/atomic.h: Likewise.
* sysdeps/x86_64/bits/atomic.h: Likewise.
* csu/tst-atomic.c: Use atomic_exchange_acq instead of atomic_exchange.
* sysdeps/unix/sysv/linux/x86_64/get_clockfreq.c: New file. * sysdeps/unix/sysv/linux/x86_64/get_clockfreq.c: New file.
2003-05-08 Ulrich Drepper <drepper@redhat.com> 2003-05-08 Ulrich Drepper <drepper@redhat.com>

View File

@ -1,6 +1,6 @@
/* Definitions of constants and data structure for POSIX 1003.1b-1993 /* Definitions of constants and data structure for POSIX 1003.1b-1993
scheduling interface. scheduling interface.
Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc. Copyright (C) 1996, 1997, 2001, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -33,3 +33,36 @@ struct sched_param
{ {
int __sched_priority; int __sched_priority;
}; };
/* Size definition for CPU sets. */
#define __CPU_SETSIZE 1024
#define __NCPUBITS (8 * sizeof (__cpu_mask))
/* Type for array elements in 'cpu_set'. */
typedef unsigned long int __cpu_mask;
/* Basic access functions. */
#define __CPUELT(cpu) ((cpu) / __NCPUBITS)
#define __CPUMASK(cpu) ((__cpu_mask) 1 << ((cpu) % __NCPUBITS))
/* Data structure to describe CPU mask. */
typedef struct
{
__cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS];
} cpu_set_t;
/* Access functions for CPU masks. */
#define __CPU_ZERO(cpusetp) \
do { \
unsigned int __i; \
cpu_set *__arr = (cpusetp); \
for (__i = 0; __i < sizeof (cpu_set) / sizeof (__cpu_mask); ++__i) \
__arr->__bits[__i] = 0; \
} while (0)
#define __CPU_SET(cpu, cpusetp) \
((cpusetp)->__bits[__CPUELT (cpu)] |= __CPUMASK (cpu))
#define __CPU_CLR(cpu, cpusetp) \
((cpusetp)->__bits[__CPUELT (cpu)] &= ~__CPUMASK (cpu))
#define __CPU_ISSET(cpu, cpusetp) \
(((cpusetp)->__bits[__CPUELT (cpu)] & __CPUMASK (cpu)) != 0)

View File

@ -99,10 +99,10 @@ do_test (void)
} }
mem = 64; mem = 64;
if (atomic_exchange (&mem, 31) != 64 if (atomic_exchange_acq (&mem, 31) != 64
|| mem != 31) || mem != 31)
{ {
puts ("atomic_exchange test failed"); puts ("atomic_exchange_acq test failed");
ret = 1; ret = 1;
} }

View File

@ -101,8 +101,8 @@
/* Store NEWVALUE in *MEM and return the old value. */ /* Store NEWVALUE in *MEM and return the old value. */
#ifndef atomic_exchange #ifndef atomic_exchange_acq
# define atomic_exchange(mem, newvalue) \ # define atomic_exchange_acq(mem, newvalue) \
({ __typeof (*(mem)) __oldval; \ ({ __typeof (*(mem)) __oldval; \
__typeof (mem) __memp = (mem); \ __typeof (mem) __memp = (mem); \
__typeof (*(mem)) __value = (newvalue); \ __typeof (*(mem)) __value = (newvalue); \
@ -117,6 +117,10 @@
__oldval; }) __oldval; })
#endif #endif
#ifndef atomic_exchange_rel
# define atomic_exchange_rel(mem, newvalue) atomic_exchange_acq (mem, newvalue)
#endif
/* Add VALUE to *MEM and return the old value of *MEM. */ /* Add VALUE to *MEM and return the old value of *MEM. */
#ifndef atomic_exchange_and_add #ifndef atomic_exchange_and_add

View File

@ -1,5 +1,26 @@
2003-05-09 Ulrich Drepper <drepper@redhat.com> 2003-05-09 Ulrich Drepper <drepper@redhat.com>
* tst-sem6.c: New file.
* Makefile (tests): Add tst-sem6.
* sysdeps/unix/sysv/linux/ia64/lowlevellock.h (___lll_mutex_unlock):
Use atomic_exchange_rel instead of atomic_exchange.
* sysdeps/unix/sysv/linux/lowlevellock.c (lll_unlock_wake_cb):
Likewise.
* sysdeps/unix/sysv/linux/i386/lowlevellock.h: Improve quality of
code for lll_futex_wait and lll_futex_wake in static apps. Use
vsyscall is possible.
* sysdeps/unix/sysv/linux/pthread_getaffinity.c: New file.
* sysdeps/unix/sysv/linux/pthread_setaffinity.c: New file.
* sysdeps/pthread/pthread.h: Declare pthread_getaffinity_np and
pthread_setaffinity_np.
* Versions [libpthread] (GLIBC_2.3.3): Add pthread_getaffinity_np
and pthread_setaffinity_np.
* Makefile (libpthread-routines): Add pthread_getaffinity and
pthread_setaffinity.
* allocatestack.c (allocate_stack): If ARCH_RETRY_MMAP is defined, * allocatestack.c (allocate_stack): If ARCH_RETRY_MMAP is defined,
use it in case mmap to allocate the stack fails. use it in case mmap to allocate the stack fails.
* sysdeps/unix/sysv/linux/x86_64/Makefile: Don't define * sysdeps/unix/sysv/linux/x86_64/Makefile: Don't define

View File

@ -115,7 +115,8 @@ libpthread-routines = init events version \
flockfile ftrylockfile funlockfile \ flockfile ftrylockfile funlockfile \
sigaction \ sigaction \
herrno res pt-allocrtsig \ herrno res pt-allocrtsig \
pthread_kill_other_threads pthread_kill_other_threads \
pthread_getaffinity pthread_setaffinity
libpthread-shared-only-routines = version pt-allocrtsig libpthread-shared-only-routines = version pt-allocrtsig
libpthread-static-only-routines = pthread_atfork libpthread-static-only-routines = pthread_atfork
@ -148,7 +149,7 @@ tests = tst-attr1 tst-attr2 \
tst-rwlock11 \ tst-rwlock11 \
tst-once1 tst-once2 tst-once3 tst-once4 \ tst-once1 tst-once2 tst-once3 tst-once4 \
tst-key1 tst-key2 tst-key3 tst-key4 \ tst-key1 tst-key2 tst-key3 tst-key4 \
tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 \ tst-sem1 tst-sem2 tst-sem3 tst-sem4 tst-sem5 tst-sem6 \
tst-barrier1 tst-barrier2 tst-barrier3 \ tst-barrier1 tst-barrier2 tst-barrier3 \
tst-align \ tst-align \
tst-basic1 tst-basic2 tst-basic3 tst-basic4 tst-basic5 tst-basic6 \ tst-basic1 tst-basic2 tst-basic3 tst-basic4 tst-basic5 tst-basic6 \

View File

@ -216,6 +216,9 @@ libpthread {
__pthread_register_cancel; __pthread_unregister_cancel; __pthread_register_cancel; __pthread_unregister_cancel;
__pthread_register_cancel_defer; __pthread_unregister_cancel_restore; __pthread_register_cancel_defer; __pthread_unregister_cancel_restore;
__pthread_unwind_next; __pthread_unwind_next;
# New affinity interfaces.
pthread_getaffinity_np; pthread_setaffinity_np;
} }
GLIBC_PRIVATE { GLIBC_PRIVATE {

View File

@ -355,6 +355,16 @@ extern int pthread_setconcurrency (int __level) __THROW;
might be differently implemented in the case of a m-on-n thread might be differently implemented in the case of a m-on-n thread
implementation. */ implementation. */
extern int pthread_yield (void) __THROW; extern int pthread_yield (void) __THROW;
/* Limit specified thread TH to run only on the processors represented
in CPUSET. */
extern int pthread_setaffinity_np (pthread_t __th, const cpu_set_t *__cpuset)
__THROW;
/* Get bit set in CPUSET representing the processors TH can run on. */
extern int pthread_getaffinity_np (pthread_t __th, cpu_set_t *__cpuset)
__THROW;
#endif #endif

View File

@ -41,17 +41,34 @@
#define LLL_MUTEX_LOCK_INITIALIZER (0) #define LLL_MUTEX_LOCK_INITIALIZER (0)
#define LLL_ENTER_KERNEL "int $0x80\n\t" #ifdef PIC
# define LLL_EBX_LOAD "xchgl %2, %%ebx\n"
# define LLL_EBX_REG "D"
#else
# define LLL_EBX_LOAD
# define LLL_EBX_REG "b"
#endif
#ifdef I386_USE_SYSENTER
# ifdef SHARED
# define LLL_ENTER_KERNEL "call *%%gs:%P6\n\t"
# else
# define LLL_ENTER_KERNEL "call *_dl_sysinfo\n\t"
# endif
#else
# define LLL_ENTER_KERNEL "int $0x80\n\t"
#endif
#define lll_futex_wait(futex, val) \ #define lll_futex_wait(futex, val) \
do { \ do { \
int __ignore; \ int __ignore; \
register __typeof (val) _val asm ("edx") = (val); \ register __typeof (val) _val asm ("edx") = (val); \
__asm __volatile ("xchgl %2, %%ebx\n\t" \ __asm __volatile (LLL_EBX_LOAD \
LLL_ENTER_KERNEL \ LLL_ENTER_KERNEL \
"xchgl %2, %%ebx" \ LLL_EBX_LOAD \
: "=a" (__ignore) \ : "=a" (__ignore) \
: "0" (SYS_futex), "D" (&futex), "S" (0), \ : "0" (SYS_futex), LLL_EBX_REG (&futex), "S" (0), \
"c" (FUTEX_WAIT), "d" (_val), \ "c" (FUTEX_WAIT), "d" (_val), \
"i" (offsetof (tcbhead_t, sysinfo))); \ "i" (offsetof (tcbhead_t, sysinfo))); \
} while (0) } while (0)
@ -61,12 +78,13 @@
do { \ do { \
int __ignore; \ int __ignore; \
register __typeof (nr) _nr asm ("edx") = (nr); \ register __typeof (nr) _nr asm ("edx") = (nr); \
__asm __volatile ("xchgl %2, %%ebx\n\t" \ __asm __volatile (LLL_EBX_LOAD \
LLL_ENTER_KERNEL \ LLL_ENTER_KERNEL \
"xchgl %2, %%ebx" \ LLL_EBX_LOAD \
: "=a" (__ignore) \ : "=a" (__ignore) \
: "0" (SYS_futex), "D" (&futex), "c" (FUTEX_WAKE), \ : "0" (SYS_futex), LLL_EBX_REG (&futex), \
"d" (_nr), "i" (0), \ "c" (FUTEX_WAKE), "d" (_nr), \
"i" (0) /* phony, to align next arg's number */, \
"i" (offsetof (tcbhead_t, sysinfo))); \ "i" (offsetof (tcbhead_t, sysinfo))); \
} while (0) } while (0)
@ -277,37 +295,19 @@ extern int lll_unlock_wake_cb (int *__futex) attribute_hidden;
afterwards. afterwards.
The macro parameter must not have any side effect. */ The macro parameter must not have any side effect. */
#ifdef PIC
# define LLL_TID_EBX_LOAD "xchgl %2, %%ebx\n"
# define LLL_TID_EBX_REG "D"
#else
# define LLL_TID_EBX_LOAD
# define LLL_TID_EBX_REG "b"
#endif
#ifdef I386_USE_SYSENTER
# ifdef SHARED
# define LLL_TID_ENTER_KERNEL "call *%%gs:%P6\n\t"
# else
# define LLL_TID_ENTER_KERNEL "call *_dl_sysinfo\n\t"
# endif
#else
# define LLL_TID_ENTER_KERNEL "int $0x80\n\t"
#endif
#define lll_wait_tid(tid) \ #define lll_wait_tid(tid) \
do { \ do { \
int __ignore; \ int __ignore; \
register __typeof (tid) _tid asm ("edx") = (tid); \ register __typeof (tid) _tid asm ("edx") = (tid); \
if (_tid != 0) \ if (_tid != 0) \
__asm __volatile (LLL_TID_EBX_LOAD \ __asm __volatile (LLL_EBX_LOAD \
"1:\tmovl %1, %%eax\n\t" \ "1:\tmovl %1, %%eax\n\t" \
LLL_TID_ENTER_KERNEL \ LLL_ENTER_KERNEL \
"cmpl $0, (%%ebx)\n\t" \ "cmpl $0, (%%ebx)\n\t" \
"jne,pn 1b\n\t" \ "jne,pn 1b\n\t" \
LLL_TID_EBX_LOAD \ LLL_EBX_LOAD \
: "=&a" (__ignore) \ : "=&a" (__ignore) \
: "i" (SYS_futex), LLL_TID_EBX_REG (&tid), "S" (0), \ : "i" (SYS_futex), LLL_EBX_REG (&tid), "S" (0), \
"c" (FUTEX_WAIT), "d" (_tid), \ "c" (FUTEX_WAIT), "d" (_tid), \
"i" (offsetof (tcbhead_t, sysinfo))); \ "i" (offsetof (tcbhead_t, sysinfo))); \
} while (0) } while (0)

View File

@ -135,7 +135,7 @@ static inline void
__attribute__ ((always_inline)) __attribute__ ((always_inline))
__lll_mutex_unlock (int *futex) __lll_mutex_unlock (int *futex)
{ {
int val = atomic_exchange (futex, 0); int val = atomic_exchange_rel (futex, 0);
if (__builtin_expect (val > 1, 0)) if (__builtin_expect (val > 1, 0))
lll_futex_wake (futex, 1); lll_futex_wake (futex, 1);

View File

@ -83,7 +83,7 @@ hidden_proto (__lll_timedlock_wait)
int int
lll_unlock_wake_cb (int *futex) lll_unlock_wake_cb (int *futex)
{ {
int val = atomic_exchange (futex, 0); int val = atomic_exchange_rel (futex, 0);
if (__builtin_expect (val > 1, 0)) if (__builtin_expect (val > 1, 0))
lll_futex_wake (futex, 1); lll_futex_wake (futex, 1);

View File

@ -0,0 +1,43 @@
/* Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <pthreadP.h>
#include <string.h>
#include <sysdep.h>
#include <sys/types.h>
int
pthread_getaffinity_np (th, cpuset)
pthread_t th;
cpu_set_t *cpuset;
{
struct pthread *pd = (struct pthread *) th;
INTERNAL_SYSCALL_DECL (err);
int res = INTERNAL_SYSCALL (sched_getaffinity, err, 3, pd->tid,
sizeof (cpu_set_t), cpuset);
if (INTERNAL_SYSCALL_ERROR_P (res, err))
return INTERNAL_SYSCALL_ERRNO (res, err);
/* Clean the rest of the memory the kernel didn't do. */
memset ((char *) cpuset + res, '\0', sizeof (cpu_set_t) - res);
return 0;
}

View File

@ -0,0 +1,38 @@
/* Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <pthreadP.h>
#include <sysdep.h>
#include <sys/types.h>
int
pthread_setaffinity_np (th, cpuset)
pthread_t th;
const cpu_set_t *cpuset;
{
struct pthread *pd = (struct pthread *) th;
INTERNAL_SYSCALL_DECL (err);
int res = INTERNAL_SYSCALL (sched_setaffinity, err, 3, pd->tid,
sizeof (cpu_set_t), cpuset);
return (INTERNAL_SYSCALL_ERROR_P (res, err)
? INTERNAL_SYSCALL_ERRNO (res, err)
: 0);
}

81
nptl/tst-sem6.c Normal file
View File

@ -0,0 +1,81 @@
/* Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <semaphore.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
static void
handler (int sig)
{
struct sigaction sa;
sa.sa_handler = SIG_DFL;
sa.sa_flags = 0;
sigemptyset (&sa.sa_mask);
sigaction (SIGALRM, &sa, NULL);
/* Rearm the timer. */
alarm (1);
}
static int
do_test (void)
{
sem_t s;
struct sigaction sa;
sa.sa_handler = handler;
sa.sa_flags = 0;
sigemptyset (&sa.sa_mask);
sigaction (SIGALRM, &sa, NULL);
if (sem_init (&s, 0, 0) == -1)
{
puts ("init failed");
return 1;
}
/* Set an alarm for 1 second. The wrapper will expect this. */
alarm (1);
int res = sem_wait (&s);
if (res == 0)
{
puts ("wait succeeded");
return 1;
}
if (res != -1 || errno != EINTR)
{
puts ("wait didn't fail with EINTR");
return 1;
}
return 0;
}
#define TIMEOUT 3
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"

View File

@ -64,13 +64,19 @@ extern int sched_rr_get_interval (__pid_t __pid, struct timespec *__t) __THROW;
#ifdef __USE_GNU #ifdef __USE_GNU
/* Access macros for `cpu_set'. */
#define CPU_SET(cpu, cpusetp) __CPU_SET (cpu, cpusetp)
#define CPU_CLR(cpu, cpusetp) __CPU_CLR (cpu, cpusetp)
#define CPU_ISSET(cpu, cpusetp) __CPU_ISSET (cpu, cpusetp)
#define CPU_ZERO(cpusetp) __CPU_ZERO (cpusetp)
/* Set the CPU affinity for a task */ /* Set the CPU affinity for a task */
extern int sched_setaffinity (__pid_t __pid, unsigned int __len, extern int sched_setaffinity (__pid_t __pid, __const cpu_set_t *__mask)
unsigned long int *__mask) __THROW; __THROW;
/* Get the CPU affinity for a task */ /* Get the CPU affinity for a task */
extern int sched_getaffinity (__pid_t __pid, unsigned int __len, extern int sched_getaffinity (__pid_t __pid, cpu_set_t *__mask) __THROW;
unsigned long int *__mask) __THROW;
#endif #endif
__END_DECLS __END_DECLS

View File

@ -1,6 +1,6 @@
/* Definitions of constants and data structure for POSIX 1003.1b-1993 /* Definitions of constants and data structure for POSIX 1003.1b-1993
scheduling interface. scheduling interface.
Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc. Copyright (C) 1996, 1997, 2001, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -33,3 +33,36 @@ struct sched_param
{ {
int __sched_priority; int __sched_priority;
}; };
/* Size definition for CPU sets. */
#define __CPU_SETSIZE 1024
#define __NCPUBITS (8 * sizeof (__cpu_mask))
/* Type for array elements in 'cpu_set'. */
typedef unsigned long int __cpu_mask;
/* Basic access functions. */
#define __CPUELT(cpu) ((cpu) / __NCPUBITS)
#define __CPUMASK(cpu) ((__cpu_mask) 1 << ((cpu) % __NCPUBITS))
/* Data structure to describe CPU mask. */
typedef struct
{
__cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS];
} cpu_set_t;
/* Access functions for CPU masks. */
#define __CPU_ZERO(cpusetp) \
do { \
unsigned int __i; \
cpu_set *__arr = (cpusetp); \
for (__i = 0; __i < sizeof (cpu_set) / sizeof (__cpu_mask); ++__i) \
__arr->__bits[__i] = 0; \
} while (0)
#define __CPU_SET(cpu, cpusetp) \
((cpusetp)->__bits[__CPUELT (cpu)] |= __CPUMASK (cpu))
#define __CPU_CLR(cpu, cpusetp) \
((cpusetp)->__bits[__CPUELT (cpu)] &= ~__CPUMASK (cpu))
#define __CPU_ISSET(cpu, cpusetp) \
(((cpusetp)->__bits[__CPUELT (cpu)] & __CPUMASK (cpu)) != 0)

View File

@ -17,16 +17,15 @@
02111-1307 USA. */ 02111-1307 USA. */
#include <errno.h> #include <errno.h>
#include <sys/types.h>
#include <sched.h> #include <sched.h>
#include <sys/types.h>
/* Retrieve the CPU affinity mask for a particular process. */ /* Retrieve the CPU affinity mask for a particular process. */
int int
sched_getaffinity (pid, len, mask) sched_getaffinity (pid, cpuset)
pid_t pid; pid_t pid;
unsigned int len; cpu_set_t *cpuset;
unsigned long int *mask;
{ {
__set_errno (ENOSYS); __set_errno (ENOSYS);
return -1; return -1;

View File

@ -23,10 +23,9 @@
/* Retrieve the CPU affinity mask for a particular process. */ /* Retrieve the CPU affinity mask for a particular process. */
int int
sched_setaffinity (pid, len, mask) sched_setaffinity (pid, mask)
pid_t pid; pid_t pid;
unsigned int len; const cpu_set_t *cpuset;
unsigned long int *mask;
{ {
__set_errno (ENOSYS); __set_errno (ENOSYS);
return -1; return -1;

View File

@ -117,7 +117,7 @@ typedef uintmax_t uatomic_max_t;
/* Note that we need no lock prefix. */ /* Note that we need no lock prefix. */
#define atomic_exchange(mem, newvalue) \ #define atomic_exchange_acq(mem, newvalue) \
({ __typeof (*mem) result; \ ({ __typeof (*mem) result; \
if (sizeof (*mem) == 1) \ if (sizeof (*mem) == 1) \
__asm __volatile ("xchgb %b0, %1" \ __asm __volatile ("xchgb %b0, %1" \

View File

@ -74,17 +74,12 @@ typedef uintmax_t uatomic_max_t;
(long) (newval)) (long) (newval))
/* Atomically store newval and return the old value. */ /* Atomically store newval and return the old value. */
#define atomic_exchange(mem, value) \ #define atomic_exchange_acq(mem, value) \
({ __typeof (*mem) __result; \ __sync_lock_test_and_set (mem, value)
if (sizeof (*mem) == 4) \
__result = __sync_lock_test_and_set_si ((int *) (mem), (int) (value)); \ #define atomic_exchange_rel(mem, value) \
else if (sizeof (*mem) == 8) \ (__sync_synchronize (), __sync_lock_test_and_set (mem, value))
__result = __sync_lock_test_and_set_di ((long *) (mem), \
(long) (value)); \
else \
abort (); \
__result; })
#define atomic_exchange_and_add(mem, value) \ #define atomic_exchange_and_add(mem, value) \
({ __typeof (*mem) __result; \ ({ __typeof (*mem) __result; \

View File

@ -76,7 +76,7 @@ typedef uintmax_t uatomic_max_t;
: "memory"); \ : "memory"); \
__ret; }) __ret; })
#define atomic_exchange(mem, newvalue) \ #define atomic_exchange_acq(mem, newvalue) \
({ __typeof (*(mem)) __result = *(mem); \ ({ __typeof (*(mem)) __result = *(mem); \
if (sizeof (*(mem)) == 1) \ if (sizeof (*(mem)) == 1) \
__asm __volatile ("1: cas%.b %0,%2,%1;" \ __asm __volatile ("1: cas%.b %0,%2,%1;" \

View File

@ -19,11 +19,11 @@
02111-1307 USA. */ 02111-1307 USA. */
/* /*
* Never include sysdeps/powerpc/bits/atomic.h directly. * Never include sysdeps/powerpc/bits/atomic.h directly.
* Alway use include/atomic.h which will include either * Alway use include/atomic.h which will include either
* sysdeps/powerpc/powerpc32/bits/atomic.h * sysdeps/powerpc/powerpc32/bits/atomic.h
* or * or
* sysdeps/powerpc/powerpc64/bits/atomic.h * sysdeps/powerpc/powerpc64/bits/atomic.h
* as appropriate and which in turn include this file. * as appropriate and which in turn include this file.
*/ */
@ -44,8 +44,8 @@ typedef uintptr_t uatomicptr_t;
typedef intmax_t atomic_max_t; typedef intmax_t atomic_max_t;
typedef uintmax_t uatomic_max_t; typedef uintmax_t uatomic_max_t;
/* /*
* Powerpc does not have byte and halfword forms of load and reserve and * Powerpc does not have byte and halfword forms of load and reserve and
* store conditional. So for powerpc we stub out the 8- and 16-bit forms. * store conditional. So for powerpc we stub out the 8- and 16-bit forms.
*/ */
#define __arch_compare_and_exchange_bool_8_acq(mem, newval, oldval) \ #define __arch_compare_and_exchange_bool_8_acq(mem, newval, oldval) \
@ -141,7 +141,7 @@ typedef uintmax_t uatomic_max_t;
__result; \ __result; \
}) })
#define atomic_exchange(mem, value) \ #define atomic_exchange_acq(mem, value) \
({ \ ({ \
__typeof (*(mem)) __result; \ __typeof (*(mem)) __result; \
if (sizeof (*mem) == 4) \ if (sizeof (*mem) == 4) \
@ -177,4 +177,3 @@ typedef uintmax_t uatomic_max_t;
abort (); \ abort (); \
__result; \ __result; \
}) })

View File

@ -66,7 +66,7 @@ typedef uintmax_t uatomic_max_t;
#define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \ #define __arch_compare_and_exchange_val_64_acq(mem, newval, oldval) \
(abort (), (__typeof (*mem)) 0) (abort (), (__typeof (*mem)) 0)
#define atomic_exchange(mem, newvalue) \ #define atomic_exchange_acq(mem, newvalue) \
({ __typeof (*(mem)) __oldval; \ ({ __typeof (*(mem)) __oldval; \
__typeof (mem) __memp = (mem); \ __typeof (mem) __memp = (mem); \
__typeof (*(mem)) __value = (newvalue); \ __typeof (*(mem)) __value = (newvalue); \

View File

@ -72,7 +72,7 @@ typedef uintmax_t uatomic_max_t;
"r" (__acev_mem), "0" ((long) (newval))); \ "r" (__acev_mem), "0" ((long) (newval))); \
__acev_tmp; }) __acev_tmp; })
#define atomic_exchange(mem, newvalue) \ #define atomic_exchange_acq(mem, newvalue) \
({ __typeof (*(mem)) __oldval, __val; \ ({ __typeof (*(mem)) __oldval, __val; \
__typeof (mem) __memp = (mem); \ __typeof (mem) __memp = (mem); \
__typeof (*(mem)) __value = (newvalue); \ __typeof (*(mem)) __value = (newvalue); \

View File

@ -1,6 +1,6 @@
/* Definitions of constants and data structure for POSIX 1003.1b-1993 /* Definitions of constants and data structure for POSIX 1003.1b-1993
scheduling interface. scheduling interface.
Copyright (C) 1996,1997,1998,1999,2001,2002 Free Software Foundation, Inc. Copyright (C) 1996-1999,2001,2002,2003 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -86,3 +86,36 @@ struct __sched_param
}; };
# undef __need_schedparam # undef __need_schedparam
#endif #endif
/* Size definition for CPU sets. */
#define __CPU_SETSIZE 1024
#define __NCPUBITS (8 * sizeof (__cpu_mask))
/* Type for array elements in 'cpu_set'. */
typedef unsigned long int __cpu_mask;
/* Basic access functions. */
#define __CPUELT(cpu) ((cpu) / __NCPUBITS)
#define __CPUMASK(cpu) ((__cpu_mask) 1 << ((cpu) % __NCPUBITS))
/* Data structure to describe CPU mask. */
typedef struct
{
__cpu_mask __bits[__CPU_SETSIZE / __NCPUBITS];
} cpu_set_t;
/* Access functions for CPU masks. */
#define __CPU_ZERO(cpusetp) \
do { \
unsigned int __i; \
cpu_set *__arr = (cpusetp); \
for (__i = 0; __i < sizeof (cpu_set) / sizeof (__cpu_mask); ++__i) \
__arr->__bits[__i] = 0; \
} while (0)
#define __CPU_SET(cpu, cpusetp) \
((cpusetp)->__bits[__CPUELT (cpu)] |= __CPUMASK (cpu))
#define __CPU_CLR(cpu, cpusetp) \
((cpusetp)->__bits[__CPUELT (cpu)] &= ~__CPUMASK (cpu))
#define __CPU_ISSET(cpu, cpusetp) \
(((cpusetp)->__bits[__CPUELT (cpu)] & __CPUMASK (cpu)) != 0)

View File

@ -0,0 +1,45 @@
/* Copyright (C) 2002, 2003 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <sched.h>
#include <string.h>
#include <sysdep.h>
#include <sys/types.h>
#ifdef __NR_sched_getaffinity
int
sched_getaffinity (pid, cpuset)
pid_t pid;
cpu_set_t *cpuset;
{
int res = INLINE_SYSCALL (sched_getaffinity, 3, pid, sizeof (cpu_set_t),
cpuset);
if (res != -1)
{
/* Clean the rest of the memory the kernel didn't do. */
memset ((char *) cpuset + res, '\0', sizeof (cpu_set_t) - res);
res = 0;
}
return res;
}
#else
# include <sysdeps/generic/sched_getaffinity.c>
#endif

View File

@ -0,0 +1,37 @@
/* Copyright (C) 2002, 2003 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 Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <errno.h>
#include <sched.h>
#include <string.h>
#include <sysdep.h>
#include <sys/types.h>
#ifdef __NR_sched_setaffinity
int
sched_setaffinity (pid, cpuset)
pid_t pid;
const cpu_set_t *cpuset;
{
return INLINE_SYSCALL (sched_setaffinity, 3, pid, sizeof (cpu_set_t),
cpuset);
}
#else
# include <sysdeps/generic/sched_setaffinity.c>
#endif

View File

@ -86,7 +86,7 @@ typedef uintmax_t uatomic_max_t;
/* Note that we need no lock prefix. */ /* Note that we need no lock prefix. */
#define atomic_exchange(mem, newvalue) \ #define atomic_exchange_acq(mem, newvalue) \
({ __typeof (*mem) result; \ ({ __typeof (*mem) result; \
if (sizeof (*mem) == 1) \ if (sizeof (*mem) == 1) \
__asm __volatile ("xchgb %b0, %1" \ __asm __volatile ("xchgb %b0, %1" \