[PATCH 12/19] nptl: Use __pthread_getattr_default_np in pthread_create

Florian Weimer fweimer@redhat.com
Tue May 19 10:44:43 GMT 2020


This removes another instance of custom attribute copying code.
---
 nptl/pthread_create.c | 32 +++++++-------------------------
 1 file changed, 7 insertions(+), 25 deletions(-)

diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index a43089065c..347d510707 100644
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -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;
 }
-- 
2.25.4




More information about the Libc-alpha mailing list