mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-07 06:43:00 +03:00
nptl: Use __pthread_getattr_default_np in pthread_create
This removes another instance of custom attribute copying code. Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
@@ -613,32 +613,14 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr,
|
|||||||
|
|
||||||
const struct pthread_attr *iattr = (struct pthread_attr *) attr;
|
const struct pthread_attr *iattr = (struct pthread_attr *) attr;
|
||||||
struct pthread_attr default_attr;
|
struct pthread_attr default_attr;
|
||||||
bool free_cpuset = false;
|
bool destroy_default_attr = false;
|
||||||
bool c11 = (attr == ATTR_C11_THREAD);
|
bool c11 = (attr == ATTR_C11_THREAD);
|
||||||
if (iattr == NULL || c11)
|
if (iattr == NULL || c11)
|
||||||
{
|
{
|
||||||
lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
|
int ret = __pthread_getattr_default_np ((pthread_attr_t *) &default_attr);
|
||||||
default_attr = __default_pthread_attr;
|
if (ret != 0)
|
||||||
size_t cpusetsize = default_attr.cpusetsize;
|
return ret;
|
||||||
if (cpusetsize > 0)
|
destroy_default_attr = true;
|
||||||
{
|
|
||||||
cpu_set_t *cpuset;
|
|
||||||
if (__glibc_likely (__libc_use_alloca (cpusetsize)))
|
|
||||||
cpuset = __alloca (cpusetsize);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cpuset = malloc (cpusetsize);
|
|
||||||
if (cpuset == NULL)
|
|
||||||
{
|
|
||||||
lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
|
|
||||||
return ENOMEM;
|
|
||||||
}
|
|
||||||
free_cpuset = true;
|
|
||||||
}
|
|
||||||
memcpy (cpuset, default_attr.cpuset, cpusetsize);
|
|
||||||
default_attr.cpuset = cpuset;
|
|
||||||
}
|
|
||||||
lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
|
|
||||||
iattr = &default_attr;
|
iattr = &default_attr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -869,8 +851,8 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (__glibc_unlikely (free_cpuset))
|
if (destroy_default_attr)
|
||||||
free (default_attr.cpuset);
|
__pthread_attr_destroy ((pthread_attr_t *) &default_attr);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user