aboutsummaryrefslogtreecommitdiff
path: root/nptl/pthread_getattr_np.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-03-19 00:14:42 +0000
committerUlrich Drepper <drepper@redhat.com>2004-03-19 00:14:42 +0000
commit439ff07be06e9354151f984c7d0d2fb05917e8be (patch)
tree2c3471a5c7e73d1f6a043b082266e7248b992c02 /nptl/pthread_getattr_np.c
parent701a7b234eab5615adb472b5dc5b0a9199d69f9b (diff)
downloadglibc-439ff07be06e9354151f984c7d0d2fb05917e8be.zip
glibc-439ff07be06e9354151f984c7d0d2fb05917e8be.tar.gz
glibc-439ff07be06e9354151f984c7d0d2fb05917e8be.tar.bz2
Update.
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.
Diffstat (limited to 'nptl/pthread_getattr_np.c')
-rw-r--r--nptl/pthread_getattr_np.c35
1 files changed, 26 insertions, 9 deletions
diff --git a/nptl/pthread_getattr_np.c b/nptl/pthread_getattr_np.c
index 0925ced..df11b1f 100644
--- a/nptl/pthread_getattr_np.c
+++ b/nptl/pthread_getattr_np.c
@@ -135,18 +135,35 @@ pthread_getattr_np (thread_id, attr)
if (ret == 0)
{
- iattr->cpuset = (cpu_set_t *) malloc (sizeof (cpu_set_t));
- if (iattr->cpuset == NULL)
- ret = ENOMEM;
- else
+ size_t size = 32;
+ cpu_set_t *cpuset = NULL;
+
+ do
{
- ret = pthread_getaffinity_np (thread_id, iattr->cpuset);
- if (ret == ENOSYS)
+ void *newp = realloc (cpuset, size);
+ if (newp == NULL)
{
- free (iattr->cpuset);
- iattr->cpuset = NULL;
- ret = 0;
+ free (cpuset);
+ ret = ENOMEM;
}
+ cpuset = (cpu_set_t *) newp;
+
+ ret = __pthread_getaffinity_np (thread_id, size, cpuset);
+ }
+ /* Pick some ridiculous upper limit. Is 8 million CPUs enough? */
+ while (ret == EINVAL && size < 1024 * 1024);
+
+ if (ret == 0)
+ {
+ iattr->cpuset = cpuset;
+ iattr->cpusetsize = size;
+ }
+ else
+ {
+ free (cpuset);
+ if (ret == ENOSYS)
+ /* There is no such functionality. */
+ ret = 0;
}
}