mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
nptl: Change type of __default_pthread_attr
union pthread_attr_transparent has always the correct size, even if pthread_attr_t has padding that is not present in struct pthread_attr. This should not result in an observable behavioral change. The existing code appears to have been correct, but it was brittle because it was not clear which functions were allowed to write to an entire pthread_attr_t argument (e.g., by copying it). Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
@ -425,7 +425,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
|
lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
|
||||||
size = __default_pthread_attr.stacksize;
|
size = __default_pthread_attr.internal.stacksize;
|
||||||
lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
|
lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,8 +318,8 @@ __pthread_initialize_minimal_internal (void)
|
|||||||
/* Round the resource limit up to page size. */
|
/* Round the resource limit up to page size. */
|
||||||
limit.rlim_cur = ALIGN_UP (limit.rlim_cur, pagesz);
|
limit.rlim_cur = ALIGN_UP (limit.rlim_cur, pagesz);
|
||||||
lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
|
lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
|
||||||
__default_pthread_attr.stacksize = limit.rlim_cur;
|
__default_pthread_attr.internal.stacksize = limit.rlim_cur;
|
||||||
__default_pthread_attr.guardsize = GLRO (dl_pagesize);
|
__default_pthread_attr.internal.guardsize = GLRO (dl_pagesize);
|
||||||
lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
|
lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
|
||||||
|
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
|
@ -199,7 +199,7 @@ enum
|
|||||||
|
|
||||||
|
|
||||||
/* Default pthread attributes. */
|
/* Default pthread attributes. */
|
||||||
extern struct pthread_attr __default_pthread_attr attribute_hidden;
|
extern union pthread_attr_transparent __default_pthread_attr attribute_hidden;
|
||||||
extern int __default_pthread_attr_lock attribute_hidden;
|
extern int __default_pthread_attr_lock attribute_hidden;
|
||||||
|
|
||||||
/* Size and alignment of static TLS block. */
|
/* Size and alignment of static TLS block. */
|
||||||
|
@ -33,7 +33,7 @@ __pthread_attr_getstacksize (const pthread_attr_t *attr, size_t *stacksize)
|
|||||||
if (size == 0)
|
if (size == 0)
|
||||||
{
|
{
|
||||||
lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
|
lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
|
||||||
size = __default_pthread_attr.stacksize;
|
size = __default_pthread_attr.internal.stacksize;
|
||||||
lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
|
lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
|
||||||
}
|
}
|
||||||
*stacksize = size;
|
*stacksize = size;
|
||||||
|
@ -612,16 +612,16 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr,
|
|||||||
STACK_VARIABLES;
|
STACK_VARIABLES;
|
||||||
|
|
||||||
const struct pthread_attr *iattr = (struct pthread_attr *) attr;
|
const struct pthread_attr *iattr = (struct pthread_attr *) attr;
|
||||||
struct pthread_attr default_attr;
|
union pthread_attr_transparent default_attr;
|
||||||
bool destroy_default_attr = 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)
|
||||||
{
|
{
|
||||||
int ret = __pthread_getattr_default_np ((pthread_attr_t *) &default_attr);
|
int ret = __pthread_getattr_default_np (&default_attr.external);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
destroy_default_attr = true;
|
destroy_default_attr = true;
|
||||||
iattr = &default_attr;
|
iattr = &default_attr.internal;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pthread *pd = NULL;
|
struct pthread *pd = NULL;
|
||||||
@ -852,7 +852,7 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr,
|
|||||||
|
|
||||||
out:
|
out:
|
||||||
if (destroy_default_attr)
|
if (destroy_default_attr)
|
||||||
__pthread_attr_destroy ((pthread_attr_t *) &default_attr);
|
__pthread_attr_destroy (&default_attr.external);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
@ -22,8 +22,7 @@ int
|
|||||||
__pthread_getattr_default_np (pthread_attr_t *out)
|
__pthread_getattr_default_np (pthread_attr_t *out)
|
||||||
{
|
{
|
||||||
lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
|
lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
|
||||||
int ret = __pthread_attr_copy (out,
|
int ret = __pthread_attr_copy (out, &__default_pthread_attr.external);
|
||||||
(pthread_attr_t *) &__default_pthread_attr);
|
|
||||||
lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
|
lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -68,15 +68,15 @@ pthread_setattr_default_np (const pthread_attr_t *in)
|
|||||||
|
|
||||||
/* Preserve the previous stack size (see above). */
|
/* Preserve the previous stack size (see above). */
|
||||||
if (temp.internal.stacksize == 0)
|
if (temp.internal.stacksize == 0)
|
||||||
temp.internal.stacksize = __default_pthread_attr.stacksize;
|
temp.internal.stacksize = __default_pthread_attr.internal.stacksize;
|
||||||
|
|
||||||
/* Destroy the old attribute structure because it will be
|
/* Destroy the old attribute structure because it will be
|
||||||
overwritten. */
|
overwritten. */
|
||||||
__pthread_attr_destroy ((pthread_attr_t *) &__default_pthread_attr);
|
__pthread_attr_destroy (&__default_pthread_attr.external);
|
||||||
|
|
||||||
/* __default_pthread_attr takes ownership, so do not free
|
/* __default_pthread_attr takes ownership, so do not free
|
||||||
attrs.internal after this point. */
|
attrs.internal after this point. */
|
||||||
__default_pthread_attr = temp.internal;
|
__default_pthread_attr = temp;
|
||||||
|
|
||||||
lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
|
lll_unlock (__default_pthread_attr_lock, LLL_PRIVATE);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
/* Default thread attributes for the case when the user does not
|
/* Default thread attributes for the case when the user does not
|
||||||
provide any. */
|
provide any. */
|
||||||
struct pthread_attr __default_pthread_attr attribute_hidden;
|
union pthread_attr_transparent __default_pthread_attr attribute_hidden;
|
||||||
|
|
||||||
/* Mutex protecting __default_pthread_attr. */
|
/* Mutex protecting __default_pthread_attr. */
|
||||||
int __default_pthread_attr_lock = LLL_LOCK_INITIALIZER;
|
int __default_pthread_attr_lock = LLL_LOCK_INITIALIZER;
|
||||||
|
Reference in New Issue
Block a user