]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
nptl: Use __pthread_getattr_default_np in pthread_create
authorFlorian Weimer <fweimer@redhat.com>
Mon, 18 May 2020 15:58:30 +0000 (17:58 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Tue, 2 Jun 2020 08:32:23 +0000 (10:32 +0200)
This removes another instance of custom attribute copying code.

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
nptl/pthread_create.c

index a43089065c7d4a48cddfd0e7aafa3056f293bf47..347d51070740d9fd645de9d9b133774db0406d5a 100644 (file)
@@ -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;
   struct pthread_attr default_attr;
-  bool free_cpuset = false;
+  bool destroy_default_attr = false;
   bool c11 = (attr == ATTR_C11_THREAD);
   if (iattr == NULL || c11)
     {
-      lll_lock (__default_pthread_attr_lock, LLL_PRIVATE);
-      default_attr = __default_pthread_attr;
-      size_t cpusetsize = default_attr.cpusetsize;
-      if (cpusetsize > 0)
-       {
-         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);
+      int ret = __pthread_getattr_default_np ((pthread_attr_t *) &default_attr);
+      if (ret != 0)
+       return ret;
+      destroy_default_attr = true;
       iattr = &default_attr;
     }
 
@@ -869,8 +851,8 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr,
     }
 
  out:
-  if (__glibc_unlikely (free_cpuset))
-    free (default_attr.cpuset);
+  if (destroy_default_attr)
+    __pthread_attr_destroy ((pthread_attr_t *) &default_attr);
 
   return retval;
 }