diff options
Diffstat (limited to 'nptl/pthread_getattr_np.c')
-rw-r--r-- | nptl/pthread_getattr_np.c | 35 |
1 files changed, 26 insertions, 9 deletions
diff --git a/nptl/pthread_getattr_np.c b/nptl/pthread_getattr_np.c index 0925ced37f..df11b1ff1d 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; } } |