[02/25] pthread_setaffinity (Linux variant): Rewrite to use VLA instead of alloca
diff mbox

Message ID 080236bd5f23d9be4c47794ad23e96d52d380f5d.1425285061.git.fweimer@redhat.com
State New
Headers show

Commit Message

Florian Weimer March 1, 2015, 2:05 p.m. UTC
extend_alloca was used to emulate VLA deallocation.
---
 sysdeps/unix/sysv/linux/pthread_setaffinity.c | 37 ++++++++++++++-------------
 1 file changed, 19 insertions(+), 18 deletions(-)

Comments

Mike Frysinger March 2, 2015, 7:58 p.m. UTC | #1
On 01 Mar 2015 15:05, Florian Weimer wrote:
> extend_alloca was used to emulate VLA deallocation.

general note: i found the old code easier to read.  i think GNU style requires 
newlines after decls and before the return statement.  that would certainly help  
readability here.
-mike

Patch
diff mbox

diff --git a/sysdeps/unix/sysv/linux/pthread_setaffinity.c b/sysdeps/unix/sysv/linux/pthread_setaffinity.c
index 37997e9..69a9a37 100644
--- a/sysdeps/unix/sysv/linux/pthread_setaffinity.c
+++ b/sysdeps/unix/sysv/linux/pthread_setaffinity.c
@@ -16,7 +16,6 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <alloca.h>
 #include <errno.h>
 #include <pthreadP.h>
 #include <sysdep.h>
@@ -27,27 +26,29 @@ 
 size_t __kernel_cpumask_size attribute_hidden;
 
 
-/* Determine the current affinity.  As a side affect we learn
-   about the size of the cpumask_t in the kernel.  */
+/* Determine the size of cpumask_t in the kernel.  */
 int
 __determine_cpumask_size (pid_t tid)
 {
-  INTERNAL_SYSCALL_DECL (err);
-  int res;
-
   size_t psize = 128;
-  void *p = alloca (psize);
-
-  while (res = INTERNAL_SYSCALL (sched_getaffinity, err, 3, tid, psize, p),
-	 INTERNAL_SYSCALL_ERROR_P (res, err)
-	 && INTERNAL_SYSCALL_ERRNO (res, err) == EINVAL)
-    p = extend_alloca (p, psize, 2 * psize);
-
-  if (res == 0 || INTERNAL_SYSCALL_ERROR_P (res, err))
-    return INTERNAL_SYSCALL_ERRNO (res, err);
-
-  __kernel_cpumask_size = res;
-
+  while (1)
+    {
+      char buf[psize];
+      INTERNAL_SYSCALL_DECL (err);
+      int res = INTERNAL_SYSCALL (sched_getaffinity, err, 3, tid, psize, buf);
+      if (INTERNAL_SYSCALL_ERROR_P (res, err)
+	  && INTERNAL_SYSCALL_ERRNO (res, err) == EINVAL)
+	/* Retry with larger size.  */
+	psize *= 2;
+      else if (res == 0 || INTERNAL_SYSCALL_ERROR_P (res, err))
+	return INTERNAL_SYSCALL_ERRNO (res, err);
+      else
+	{
+	  /* Size has been determined.  */
+	  __kernel_cpumask_size = res;
+	  break;
+	}
+    }
   return 0;
 }