]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
nptl: Use __pthread_attr_setaffinity_np in pthread_getattr_np
authorFlorian Weimer <fweimer@redhat.com>
Fri, 15 May 2020 15:38:57 +0000 (17:38 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Tue, 2 Jun 2020 08:32:30 +0000 (10:32 +0200)
This avoids duplicating the code for the affinity mask allocation
handling.

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

index 0e8911346d514787b44bac77ec3b68e81aa88a71..ce437205e41dc05653e435f6188768cccdd91c99 100644 (file)
@@ -33,8 +33,13 @@ int
 __pthread_getattr_np (pthread_t thread_id, pthread_attr_t *attr)
 {
   struct pthread *thread = (struct pthread *) thread_id;
+
+  /* Prepare the new thread attribute.  */
+  int ret = __pthread_attr_init (attr);
+  if (ret != 0)
+    return ret;
+
   struct pthread_attr *iattr = (struct pthread_attr *) attr;
-  int ret = 0;
 
   lll_lock (thread->lock, LLL_PRIVATE);
 
@@ -187,25 +192,18 @@ __pthread_getattr_np (pthread_t thread_id, pthread_attr_t *attr)
       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;
-             iattr->cpuset = NULL;
-             iattr->cpusetsize = 0;
-           }
-       }
+       ret = __pthread_attr_setaffinity_np (attr, size, cpuset);
+      else if (ret == ENOSYS)
+       /* There is no such functionality.  */
+       ret = 0;
+      free (cpuset);
     }
 
   lll_unlock (thread->lock, LLL_PRIVATE);
 
+  if (ret != 0)
+    __pthread_attr_destroy (attr);
+
   return ret;
 }
 versioned_symbol (libc, __pthread_getattr_np, pthread_getattr_np, GLIBC_2_32);