* posix/Makefile (routines): Add sched_cpualloc and sched_cpufree.

(tests): Add tst-cpuset.
	* posix/sched_cpualloc.c: New file.
	* posix/sched_cpufree.c: New file.
	* posix/tst-cpuset.c: New file.
	* posix/Versions: Export __sched_cpualloc and __sched_cpufree for
	GLIBC_2.7.
	* sysdeps/unix/sysv/linux/bits/sched.h: Define __CPU_*_S macros.
	* posix/sched.h: Define old CPU_* macros in temers of __CPU_*_S
	macros.  Define CPU_*_S macros.
This commit is contained in:
Ulrich Drepper 2007-07-29 22:24:44 +00:00
parent a14ad5ae4b
commit 44f08a6ecc
7 changed files with 200 additions and 13 deletions

View File

@ -1,3 +1,16 @@
2007-07-29 Ulrich Drepper <drepper@redhat.com>
* posix/Makefile (routines): Add sched_cpualloc and sched_cpufree.
(tests): Add tst-cpuset.
* posix/sched_cpualloc.c: New file.
* posix/sched_cpufree.c: New file.
* posix/tst-cpuset.c: New file.
* posix/Versions: Export __sched_cpualloc and __sched_cpufree for
GLIBC_2.7.
* sysdeps/unix/sysv/linux/bits/sched.h: Define __CPU_*_S macros.
* posix/sched.h: Define old CPU_* macros in temers of __CPU_*_S
macros. Define CPU_*_S macros.
2007-07-28 Ulrich Drepper <drepper@redhat.com>
* posix/getconf.c (vars): Add missing _SC_LEVEL4_CACHE_LINESIZE

View File

@ -66,7 +66,7 @@ routines := \
spawnattr_getsigmask spawnattr_getschedpolicy spawnattr_getschedparam \
spawnattr_setsigmask spawnattr_setschedpolicy spawnattr_setschedparam \
posix_madvise \
get_child_max sched_cpucount
get_child_max sched_cpucount sched_cpualloc sched_cpufree
include ../Makeconfig
@ -90,7 +90,7 @@ tests := tstgetopt testfnm runtests runptests \
tst-execv1 tst-execv2 tst-execl1 tst-execl2 \
tst-execve1 tst-execve2 tst-execle1 tst-execle2 \
tst-execvp3 tst-execvp4 tst-rfc3484 tst-rfc3484-2 \
tst-getaddrinfo3 tst-fnmatch2 tst-cpucount
tst-getaddrinfo3 tst-fnmatch2 tst-cpucount tst-cpuset
xtests := bug-ga2
ifeq (yes,$(build-shared))
test-srcs := globtest

View File

@ -125,6 +125,9 @@ libc {
GLIBC_2.6 {
__sched_cpucount;
}
GLIBC_2.7 {
__sched_cpualloc; __sched_cpufree;
}
GLIBC_PRIVATE {
__libc_fork; __libc_pwrite;
}

27
posix/sched_cpualloc.c Normal file
View File

@ -0,0 +1,27 @@
/* Copyright (C) 2007 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 <sched.h>
#include <stdlib.h>
cpu_set_t *
__sched_cpualloc (size_t count)
{
return malloc (CPU_ALLOC_SIZE (count));
}

27
posix/sched_cpufree.c Normal file
View File

@ -0,0 +1,27 @@
/* Copyright (C) 2007 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 <sched.h>
#include <stdlib.h>
void
__sched_cpufree (cpu_set_t *set)
{
free (set);
}

82
posix/tst-cpuset.c Normal file
View File

@ -0,0 +1,82 @@
#include <sched.h>
#include <stdio.h>
static int
do_test (void)
{
int result = 0;
cpu_set_t s1;
cpu_set_t s2;
cpu_set_t s3;
CPU_ZERO (&s1);
CPU_SET (0, &s1);
CPU_ZERO (&s2);
CPU_SET (0, &s2);
CPU_SET (1, &s2);
CPU_AND (&s3, &s1, &s2);
if (! CPU_EQUAL (&s3, &s1))
{
puts ("result of CPU_AND wrong");
result = 1;
}
CPU_OR (&s3, &s1, &s2);
if (! CPU_EQUAL (&s3, &s2))
{
puts ("result of CPU_OR wrong");
result = 1;
}
CPU_XOR (&s3, &s1, &s2);
if (CPU_COUNT (&s3) != 1)
{
puts ("result of CPU_XOR wrong");
result = 1;
}
cpu_set_t *vs1 = CPU_ALLOC (2048);
cpu_set_t *vs2 = CPU_ALLOC (2048);
cpu_set_t *vs3 = CPU_ALLOC (2048);
size_t vssize = CPU_ALLOC_SIZE (2048);
CPU_ZERO_S (vssize, vs1);
CPU_SET_S (0, vssize, vs1);
CPU_ZERO_S (vssize, vs2);
CPU_SET_S (0, vssize, vs2);
CPU_SET_S (2047, vssize, vs2);
CPU_AND_S (vssize, vs3, vs1, vs2);
if (! CPU_EQUAL_S (vssize, vs3, vs1))
{
puts ("result of CPU_AND_S wrong");
result = 1;
}
CPU_OR_S (vssize, vs3, vs1, vs2);
if (! CPU_EQUAL_S (vssize, vs3, vs2))
{
puts ("result of CPU_OR_S wrong");
result = 1;
}
CPU_XOR_S (vssize, vs3, vs1, vs2);
if (CPU_COUNT_S (vssize, vs3) != 1)
{
puts ("result of CPU_XOR_S wrong");
result = 1;
}
CPU_FREE (vs1);
CPU_FREE (vs2);
CPU_FREE (vs3);
return result;
}
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"

View File

@ -118,27 +118,62 @@ typedef struct
} cpu_set_t;
/* Access functions for CPU masks. */
# define __CPU_ZERO(cpusetp) \
# define __CPU_ZERO_S(setsize, cpusetp) \
do { \
unsigned int __i; \
size_t __i; \
size_t __imax = (setsize) / sizeof (__cpu_mask); \
cpu_set_t *__arr = (cpusetp); \
for (__i = 0; __i < sizeof (cpu_set_t) / sizeof (__cpu_mask); ++__i) \
for (__i = 0; __i < __imax; ++__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)
# define __CPU_SET_S(cpu, setsize, cpusetp) \
({ size_t __cpu = (cpu); \
__cpu < 8 * (setsize) \
? ((cpusetp)->__bits[__CPUELT (__cpu)] |= __CPUMASK (__cpu)) : 0; })
# define __CPU_CLR_S(cpu, setsize, cpusetp) \
({ size_t __cpu = (cpu); \
__cpu < 8 * (setsize) \
? ((cpusetp)->__bits[__CPUELT (__cpu)] &= ~__CPUMASK (__cpu)) : 0; })
# define __CPU_ISSET_S(cpu, setsize, cpusetp) \
({ size_t __cpu = (cpu); \
__cpu < 8 * (setsize) \
? (((cpusetp)->__bits[__CPUELT (__cpu)] & __CPUMASK (__cpu))) != 0 : 0; })
# define __CPU_COUNT_S(setsize, cpusetp) \
__sched_cpucount (setsize, cpusetp)
# define __CPU_EQUAL_S(setsize, cpusetp1, cpusetp2) \
({ cpu_set_t *__arr1 = (cpusetp1); \
cpu_set_t *__arr2 = (cpusetp2); \
size_t __imax = (setsize) / sizeof (__cpu_mask); \
size_t __i; \
for (__i = 0; __i < __imax; ++__i) \
if (__arr1->__bits[__i] != __arr2->__bits[__i]) \
break; \
__i == __imax; })
# define __CPU_OP_S(setsize, destset, srcset1, srcset2, op) \
({ cpu_set_t *__dest = (destset); \
cpu_set_t *__arr1 = (srcset1); \
cpu_set_t *__arr2 = (srcset2); \
size_t __imax = (setsize) / sizeof (__cpu_mask); \
size_t __i; \
for (__i = 0; __i < __imax; ++__i) \
__dest->__bits[__i] = __arr1->__bits[__i] op __arr2->__bits[__i]; \
__dest; })
# define __CPU_ALLOC_SIZE(count) \
((((count) + __NCPUBITS - 1) / __NCPUBITS) * 8)
# define __CPU_ALLOC(count) __sched_cpualloc (count)
# define __CPU_FREE(cpuset) __sched_cpufree (cpuset)
__BEGIN_DECLS
extern int __sched_cpucount (size_t __setsize, const cpu_set_t *__setp)
__THROW;
extern cpu_set_t *__sched_cpualloc (size_t __count) __THROW __wur;
extern void __sched_cpufree (cpu_set_t *__set) __THROW;
__END_DECLS
# define __CPU_COUNT(cpusetp) \
__sched_cpucount (sizeof (cpu_set_t), cpusetp)
#endif