From 341c566f05fa6b19b88508f7ddd835bfd101731b Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 11 May 2007 06:39:07 +0000 Subject: [PATCH] * 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. --- ChangeLog | 7 +++++ include/link.h | 10 +++---- nptl/ChangeLog | 3 ++ nptl/descr.h | 8 +++--- sysdeps/unix/sysv/linux/Makefile | 2 ++ sysdeps/unix/sysv/linux/tst-getcpu.c | 53 ++++++++++++++++++++++++++++++++++++ 6 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 sysdeps/unix/sysv/linux/tst-getcpu.c diff --git a/ChangeLog b/ChangeLog index 2451fea..9490240 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2007-05-10 Ulrich Drepper + * 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 diff --git a/include/link.h b/include/link.h index b45deab..67d7047 100644 --- a/include/link.h +++ b/include/link.h @@ -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; diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 2451166..882d3e9 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,5 +1,8 @@ 2007-05-10 Ulrich Drepper + * 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. diff --git a/nptl/descr.h b/nptl/descr.h index 321ce85..00cad1a 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -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 , 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; diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 78553b9..a063b33 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -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 index 0000000..78c4a69 --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-getcpu.c @@ -0,0 +1,53 @@ +#include +#include +#include + + +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 -- 2.7.4