* sysdeps/unix/sysv/linux/tst-getcpu.c: New file.
authorUlrich Drepper <drepper@redhat.com>
Fri, 11 May 2007 06:39:07 +0000 (06:39 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 11 May 2007 06:39:07 +0000 (06:39 +0000)
* sysdeps/unix/sysv/linux/Makefile [subdir=posix] (tests): Add
tst-getcpu.

* include/link.h: Move l_version and l_nversion members around to
fill gaps.

ChangeLog
include/link.h
nptl/ChangeLog
nptl/descr.h
sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/tst-getcpu.c [new file with mode: 0644]

index 2451fea..9490240 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2007-05-10  Ulrich Drepper  <drepper@redhat.com>
 
+       * sysdeps/unix/sysv/linux/tst-getcpu.c: New file.
+       * sysdeps/unix/sysv/linux/Makefile [subdir=posix] (tests): Add
+       tst-getcpu.
+
+       * include/link.h: Move l_version and l_nversion members around to
+       fill gaps.
+
        * scripts/check-c++-types.sh: Don't use -fnu89-inline option.
 
        * sysdeps/unix/sysv/linux/sched_setaffinity.c
index b45deab..67d7047 100644 (file)
@@ -1,6 +1,6 @@
 /* Data structure for communication from the run-time dynamic linker for
    loaded ELF shared objects.
-   Copyright (C) 1995-2002,2003,2004,2005,2006 Free Software Foundation, Inc.
+   Copyright (C) 1995-2006, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -141,6 +141,10 @@ struct link_map
     /* Dependent object that first caused this object to be loaded.  */
     struct link_map *l_loader;
 
+    /* Array with version names.  */
+    struct r_found_version *l_versions;
+    unsigned int l_nversions;
+
     /* Symbol hash table.  */
     Elf_Symndx l_nbuckets;
     Elf32_Word l_gnu_bitmask_idxbits;
@@ -184,10 +188,6 @@ struct link_map
     unsigned int l_removed:1;  /* Nozero if the object cannot be used anymore
                                   since it is removed.  */
 
-    /* Array with version names.  */
-    unsigned int l_nversions;
-    struct r_found_version *l_versions;
-
     /* Collected information about own RPATH directories.  */
     struct r_search_path_struct l_rpath_dirs;
 
index 2451166..882d3e9 100644 (file)
@@ -1,5 +1,8 @@
 2007-05-10  Ulrich Drepper  <drepper@redhat.com>
 
+       * descr.h (struct pthread): Rearrange members to fill hole in
+       64-bit layout.
+
        * sysdeps/unix/sysv/linux/pthread_setaffinity.c
        (__pthread_setaffinity_new): If syscall was successful and
        RESET_VGETCPU_CACHE is defined, use it before returning.
index 321ce85..00cad1a 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2002-2006, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
@@ -268,6 +268,9 @@ struct pthread
               | EXITING_BITMASK | CANCEL_RESTMASK | TERMINATED_BITMASK))     \
    == (CANCELTYPE_BITMASK | CANCELED_BITMASK))
 
+  /* Flags.  Including those copied from the thread attribute.  */
+  int flags;
+
   /* We allocate one block of references here.  This should be enough
      to avoid allocating any memory dynamically for most applications.  */
   struct pthread_key_data
@@ -321,9 +324,6 @@ struct pthread
   /* Check whether a thread is detached.  */
 #define IS_DETACHED(pd) ((pd)->joinid == (pd))
 
-  /* Flags.  Including those copied from the thread attribute.  */
-  int flags;
-
   /* The result of the thread function.  */
   void *result;
 
index 78553b9..a063b33 100644 (file)
@@ -113,6 +113,8 @@ ifeq ($(subdir),posix)
 sysdep_headers += bits/initspin.h
 
 sysdep_routines += exit-thread sched_getcpu
+
+tests += tst-getcpu
 endif
 
 ifeq ($(subdir),inet)
diff --git a/sysdeps/unix/sysv/linux/tst-getcpu.c b/sysdeps/unix/sysv/linux/tst-getcpu.c
new file mode 100644 (file)
index 0000000..78c4a69
--- /dev/null
@@ -0,0 +1,53 @@
+#include <errno.h>
+#include <stdio.h>
+#include <sched.h>
+
+
+static int
+do_test (void)
+{
+  cpu_set_t cs;
+  if (sched_getaffinity (getpid (), sizeof (cs), &cs) != 0)
+    {
+      printf ("getaffinity failed: %m\n");
+      return 1;
+    }
+
+  int result = 0;
+  int cpu = 0;
+  while (CPU_COUNT (&cs) != 0)
+    {
+      if (CPU_ISSET (cpu, &cs))
+       {
+         cpu_set_t cs2;
+         CPU_ZERO (&cs2);
+         CPU_SET (cpu, &cs2);
+         if (sched_setaffinity (getpid (), sizeof (cs2), &cs2) != 0)
+           {
+             printf ("setaffinity(%d) failed: %m\n", cpu);
+             result = 1;
+           }
+         else
+           {
+             int cpu2 = sched_getcpu ();
+             if (cpu2 == -1 && errno == ENOSYS)
+               {
+                 puts ("getcpu syscall not implemented");
+                 return 0;
+               }
+             if (cpu2 != cpu)
+               {
+                 printf ("getcpu results %d not possible\n", cpu2);
+                 result = 1;
+               }
+           }
+         CPU_CLR (cpu, &cs);
+       }
+      ++cpu;
+    }
+
+  return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include <test-skeleton.c>