1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-30 22:43:12 +03:00
2004-03-18  Ulrich Drepper  <drepper@redhat.com>

	* posix/sched.h: Change sched_getaffinity and sched_setaffinity
	interfaces: add new second parameter.
	* sysdeps/generic/sched_getaffinity.c: Implement interface change.
	* sysdeps/generic/sched_setaffinity.c: Likewise.
	* sysdeps/unix/sysv/linux/sched_getaffinity.c: Likewise.  Add
	compatibility interface.
	* sysdeps/unix/sysv/linux/sched_setaffinity.c: Likewise.
	* sysdeps/unix/sysv/linux/Versions: Add versions for changed
	interfaces.
This commit is contained in:
Ulrich Drepper
2004-03-19 00:14:42 +00:00
parent 701a7b234e
commit 439ff07be0
18 changed files with 326 additions and 125 deletions

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2003 Free Software Foundation, Inc.
/* Copyright (C) 2003, 2004 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
@ -19,37 +19,77 @@
#include <assert.h>
#include <errno.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <pthreadP.h>
#include <shlib-compat.h>
/* Defined in pthread_setaffinity.c. */
extern size_t __kernel_cpumask_size;
extern int __determine_cpumask_size (pid_t tid);
int
pthread_attr_setaffinity_np (attr, cpuset)
pthread_attr_t *attr;
const cpu_set_t *cpuset;
__pthread_attr_setaffinity_new (pthread_attr_t *attr, size_t cpusetsize,
const cpu_set_t *cpuset)
{
struct pthread_attr *iattr;
assert (sizeof (*attr) >= sizeof (struct pthread_attr));
iattr = (struct pthread_attr *) attr;
if (cpuset == NULL)
if (cpuset == NULL || cpusetsize == 0)
{
free (iattr->cpuset);
iattr->cpuset = NULL;
iattr->cpusetsize = 0;
}
else
{
if (iattr->cpuset == NULL)
if (__kernel_cpumask_size == 0)
{
iattr->cpuset = (cpu_set_t *) malloc (sizeof (cpu_set_t));
if (iattr->cpuset == NULL)
return ENOMEM;
int res = __determine_cpumask_size (THREAD_SELF->tid);
if (res != 0)
/* Some serious problem. */
return res;
}
memcpy (iattr->cpuset, cpuset, sizeof (cpu_set_t));
/* Check whether the new bitmask has any bit set beyond the
last one the kernel accepts. */
for (size_t cnt = __kernel_cpumask_size; cnt < cpusetsize; ++cnt)
if (((char *) cpuset)[cnt] != '\0')
/* Found a nonzero byte. This means the user request cannot be
fulfilled. */
return EINVAL;
if (iattr->cpusetsize != cpusetsize)
{
void *newp = (cpu_set_t *) realloc (iattr->cpuset, cpusetsize);
if (newp == NULL)
return ENOMEM;
iattr->cpuset = newp;
iattr->cpusetsize = cpusetsize;
}
memcpy (iattr->cpuset, cpuset, cpusetsize);
}
return 0;
}
versioned_symbol (libpthread, __pthread_attr_setaffinity_new,
pthread_attr_setaffinity_np, GLIBC_2_3_4);
#if SHLIB_COMPAT(libpthread, 2_3_3, 2_3_4)
int
__pthread_attr_setaffinity_old (const pthread_attr_t *attr, cpu_set_t *cpuset)
{
/* The old interface by default assumed a 1024 processor bitmap. */
return __pthread_attr_setaffinity_new (attr, 128, cpuset);
}
compat_symbol (libpthread, __pthread_attr_setaffinity_old,
pthread_attr_setaffinity_np, GLIBC_2_3_3);
#endif