Updated to fedora-glibc-20070515T2025
authorroland <roland>
Tue, 15 May 2007 20:34:27 +0000 (20:34 +0000)
committerroland <roland>
Tue, 15 May 2007 20:34:27 +0000 (20:34 +0000)
23 files changed:
ChangeLog
README
elf/dl-close.c
elf/dl-open.c
fedora/branch.mk
include/features.h
include/link.h
malloc/arena.c
malloc/hooks.c
malloc/malloc.c
nptl/ChangeLog
nptl/TODO
nptl/descr.h
nptl/sysdeps/unix/sysv/linux/pthread_setaffinity.c
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_setaffinity.c [new file with mode: 0644]
nptl/sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S
nptl/sysdeps/unix/sysv/linux/x86_64/sem_wait.S
scripts/check-c++-types.sh
sysdeps/unix/sysv/linux/Makefile
sysdeps/unix/sysv/linux/sched_setaffinity.c
sysdeps/unix/sysv/linux/tst-getcpu.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/x86_64/sched_setaffinity.c [new file with mode: 0644]
version.h

index 6a8b6dd..d23f2ef 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,50 @@
+2007-05-14  Ulrich Drepper  <drepper@redhat.com>
+
+       * version.h (VERSION): Define to 6.
+       * include/features.h (__GLIBC_MINOR__): Likewise.
+
+       * malloc/malloc.c: Use all small bin slots on 64-bit archs.
+
+       * malloc/malloc.c (largebin_index): Really have 32 buckets with 64
+       sizes.
+
+2007-05-13  Ulrich Drepper  <drepper@redhat.com>
+
+       * malloc/malloc.c [MALLOC_DEBUG]: Keep track of current maximum
+       number of mmaps.  n_mmaps_max is the target.
+       * malloc/hooks.c: Likewise.
+       * malloc/arena.c: Likewise.
+
+2007-05-12  Andreas Jaeger  <aj@suse.de>
+
+       * sysdeps/unix/sysv/linux/tst-getcpu.c: Include <unistd.h> for
+       getpid.
+
+2007-05-11  Ulrich Drepper  <drepper@redhat.com>
+
+       * elf/dl-close.c (_dl_close_worker): Help gcc to optimize by
+       adding new variables.
+
+       * elf/dl-open.c (add_to_global): Introduce variable ns to help gcc
+       optimize.  Completely extend global scope array before making the
+       new entries visible.
+
 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
+       (__sched_setaffinity_new): If syscall was successful and
+       RESET_VGETCPU_CACHE is defined, use it before returning.
+       * sysdeps/unix/sysv/linux/x86_64/sched_setaffinity.c: New file.
+
        * io/sys/stat.h: Make sure struct timespec is defined for
        __USE_ATFILE.
 
diff --git a/README b/README
index 97b3a61..7b82d80 100644 (file)
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-This directory contains the version 2.5 release of the GNU C Library.
+This directory contains the version 2.6 release of the GNU C Library.
 
 The GNU C Library is the standard system C library for all GNU systems,
 and is an important part of what makes up a GNU system.  It provides the
@@ -52,7 +52,7 @@ The GNU C Library supports these configurations for using Linux kernels:
 
 The code for other CPU configurations supported by volunteers outside of
 the core glibc maintenance effort is contained in the separate `ports'
-add-on.  You can find glibc-ports-2.5 distributed separately in the
+add-on.  You can find glibc-ports-2.6 distributed separately in the
 same place where you got the main glibc distribution files.
 Currently these configurations are known to work using the `ports' add-on:
 
index df968fe..e0fe26a 100644 (file)
@@ -1,5 +1,5 @@
 /* Close a shared object opened by `_dl_open'.
-   Copyright (C) 1996-2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1996-2005, 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
@@ -107,8 +107,6 @@ remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp,
 void
 _dl_close_worker (struct link_map *map)
 {
-  Lmid_t ns = map->l_ns;
-
   /* One less direct use.  */
   --map->l_direct_opencount;
 
@@ -131,11 +129,14 @@ _dl_close_worker (struct link_map *map)
       return;
     }
 
+  Lmid_t nsid = map->l_ns;
+  struct link_namespaces *ns = &GL(dl_ns)[nsid];
+
  retry:
   dl_close_state = pending;
 
   bool any_tls = false;
-  const unsigned int nloaded = GL(dl_ns)[ns]._ns_nloaded;
+  const unsigned int nloaded = ns->_ns_nloaded;
   char used[nloaded];
   char done[nloaded];
   struct link_map *maps[nloaded];
@@ -143,7 +144,7 @@ _dl_close_worker (struct link_map *map)
   /* Run over the list and assign indexes to the link maps and enter
      them into the MAPS array.  */
   int idx = 0;
-  for (struct link_map *l = GL(dl_ns)[ns]._ns_loaded; l != NULL; l = l->l_next)
+  for (struct link_map *l = ns->_ns_loaded; l != NULL; l = l->l_next)
     {
       l->l_idx = idx;
       maps[idx] = l;
@@ -220,11 +221,11 @@ _dl_close_worker (struct link_map *map)
     }
 
   /* Sort the entries.  */
-  _dl_sort_fini (GL(dl_ns)[ns]._ns_loaded, maps, nloaded, used, ns);
+  _dl_sort_fini (ns->_ns_loaded, maps, nloaded, used, nsid);
 
   /* Call all termination functions at once.  */
 #ifdef SHARED
-  bool do_audit = GLRO(dl_naudit) > 0 && !GL(dl_ns)[ns]._ns_loaded->l_auditing;
+  bool do_audit = GLRO(dl_naudit) > 0 && !ns->_ns_loaded->l_auditing;
 #endif
   bool unload_any = false;
   unsigned int first_loaded = ~0;
@@ -233,7 +234,7 @@ _dl_close_worker (struct link_map *map)
       struct link_map *imap = maps[i];
 
       /* All elements must be in the same namespace.  */
-      assert (imap->l_ns == ns);
+      assert (imap->l_ns == nsid);
 
       if (!used[i])
        {
@@ -248,7 +249,7 @@ _dl_close_worker (struct link_map *map)
              if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS,
                                    0))
                _dl_debug_printf ("\ncalling fini: %s [%lu]\n\n",
-                                 imap->l_name, ns);
+                                 imap->l_name, nsid);
 
              if (imap->l_info[DT_FINI_ARRAY] != NULL)
                {
@@ -334,7 +335,7 @@ _dl_close_worker (struct link_map *map)
                struct link_map *tmap = (struct link_map *)
                  ((char *) imap->l_scope[cnt]
                   - offsetof (struct link_map, l_searchlist));
-               assert (tmap->l_ns == ns);
+               assert (tmap->l_ns == nsid);
                if (tmap->l_idx == IDX_STILL_USED)
                  ++remain;
                else
@@ -435,7 +436,7 @@ _dl_close_worker (struct link_map *map)
   /* Auditing checkpoint: we will start deleting objects.  */
   if (__builtin_expect (do_audit, 0))
     {
-      struct link_map *head = GL(dl_ns)[ns]._ns_loaded;
+      struct link_map *head = ns->_ns_loaded;
       struct audit_ifaces *afct = GLRO(dl_audit);
       /* Do not call the functions for any auditing object.  */
       if (head->l_auditing == 0)
@@ -452,7 +453,7 @@ _dl_close_worker (struct link_map *map)
 #endif
 
   /* Notify the debugger we are about to remove some loaded objects.  */
-  struct r_debug *r = _dl_debug_initialize (0, ns);
+  struct r_debug *r = _dl_debug_initialize (0, nsid);
   r->r_state = RT_DELETE;
   _dl_debug_state ();
 
@@ -474,19 +475,18 @@ _dl_close_worker (struct link_map *map)
          if (__builtin_expect (imap->l_global, 0))
            {
              /* This object is in the global scope list.  Remove it.  */
-             unsigned int cnt = GL(dl_ns)[ns]._ns_main_searchlist->r_nlist;
+             struct r_scope_elem *ns_msl = ns->_ns_main_searchlist;
+             unsigned int cnt = ns_msl->r_nlist;
 
              do
                --cnt;
-             while (GL(dl_ns)[ns]._ns_main_searchlist->r_list[cnt] != imap);
+             while (ns_msl->r_list[cnt] != imap);
 
              /* The object was already correctly registered.  */
-             while (++cnt
-                    < GL(dl_ns)[ns]._ns_main_searchlist->r_nlist)
-               GL(dl_ns)[ns]._ns_main_searchlist->r_list[cnt - 1]
-                 = GL(dl_ns)[ns]._ns_main_searchlist->r_list[cnt];
+             while (++cnt < ns_msl->r_nlist)
+               ns_msl->r_list[cnt - 1] = ns_msl->r_list[cnt];
 
-             --GL(dl_ns)[ns]._ns_main_searchlist->r_nlist;
+             --ns_msl->r_nlist;
            }
 
          /* Remove the object from the dtv slotinfo array if it uses TLS.  */
@@ -581,12 +581,12 @@ _dl_close_worker (struct link_map *map)
          else
            {
 #ifdef SHARED
-             assert (ns != LM_ID_BASE);
+             assert (nsid != LM_ID_BASE);
 #endif
-             GL(dl_ns)[ns]._ns_loaded = imap->l_next;
+             ns->_ns_loaded = imap->l_next;
            }
 
-         --GL(dl_ns)[ns]._ns_nloaded;
+         --ns->_ns_nloaded;
          if (imap->l_next != NULL)
            imap->l_next->l_prev = imap->l_prev;
 
@@ -648,7 +648,7 @@ _dl_close_worker (struct link_map *map)
   /* Auditing checkpoint: we have deleted all objects.  */
   if (__builtin_expect (do_audit, 0))
     {
-      struct link_map *head = GL(dl_ns)[ns]._ns_loaded;
+      struct link_map *head = ns->_ns_loaded;
       /* Do not call the functions for any auditing object.  */
       if (head->l_auditing == 0)
        {
@@ -732,22 +732,22 @@ free_slotinfo (struct dtv_slotinfo_list **elemp)
 
 libc_freeres_fn (free_mem)
 {
-  for (Lmid_t ns = 0; ns < DL_NNS; ++ns)
-    if (__builtin_expect (GL(dl_ns)[ns]._ns_global_scope_alloc, 0) != 0
-       && (GL(dl_ns)[ns]._ns_main_searchlist->r_nlist
+  for (Lmid_t nsid = 0; nsid < DL_NNS; ++nsid)
+    if (__builtin_expect (GL(dl_ns)[nsid]._ns_global_scope_alloc, 0) != 0
+       && (GL(dl_ns)[nsid]._ns_main_searchlist->r_nlist
            // XXX Check whether we need NS-specific initial_searchlist
            == GLRO(dl_initial_searchlist).r_nlist))
       {
        /* All object dynamically loaded by the program are unloaded.  Free
           the memory allocated for the global scope variable.  */
-       struct link_map **old = GL(dl_ns)[ns]._ns_main_searchlist->r_list;
+       struct link_map **old = GL(dl_ns)[nsid]._ns_main_searchlist->r_list;
 
        /* Put the old map in.  */
-       GL(dl_ns)[ns]._ns_main_searchlist->r_list
+       GL(dl_ns)[nsid]._ns_main_searchlist->r_list
          // XXX Check whether we need NS-specific initial_searchlist
          = GLRO(dl_initial_searchlist).r_list;
        /* Signal that the original map is used.  */
-       GL(dl_ns)[ns]._ns_global_scope_alloc = 0;
+       GL(dl_ns)[nsid]._ns_global_scope_alloc = 0;
 
        /* Now free the old map.  */
        free (old);
index 2593721..5838787 100644 (file)
@@ -1,5 +1,5 @@
 /* Load a shared object at runtime, relocate it, and run its initializer.
-   Copyright (C) 1996-2004, 2005, 2006 Free Software Foundation, Inc.
+   Copyright (C) 1996-2004, 2005, 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
@@ -97,17 +97,17 @@ add_to_global (struct link_map *new)
      in an realloc() call.  Therefore we allocate a completely new
      array the first time we have to add something to the locale scope.  */
 
-  if (GL(dl_ns)[new->l_ns]._ns_global_scope_alloc == 0)
+  struct link_namespaces *ns = &GL(dl_ns)[new->l_ns];
+  if (ns->_ns_global_scope_alloc == 0)
     {
       /* This is the first dynamic object given global scope.  */
-      GL(dl_ns)[new->l_ns]._ns_global_scope_alloc
-       = GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist + to_add + 8;
+      ns->_ns_global_scope_alloc
+       = ns->_ns_main_searchlist->r_nlist + to_add + 8;
       new_global = (struct link_map **)
-       malloc (GL(dl_ns)[new->l_ns]._ns_global_scope_alloc
-               * sizeof (struct link_map *));
+       malloc (ns->_ns_global_scope_alloc * sizeof (struct link_map *));
       if (new_global == NULL)
        {
-         GL(dl_ns)[new->l_ns]._ns_global_scope_alloc = 0;
+         ns->_ns_global_scope_alloc = 0;
        nomem:
          _dl_signal_error (ENOMEM, new->l_libname->name, NULL,
                            N_("cannot extend global scope"));
@@ -115,29 +115,29 @@ add_to_global (struct link_map *new)
        }
 
       /* Copy over the old entries.  */
-      GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list
-       = memcpy (new_global,
-                 GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list,
-                 (GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist
+      ns->_ns_main_searchlist->r_list
+       = memcpy (new_global, ns->_ns_main_searchlist->r_list,
+                 (ns->_ns_main_searchlist->r_nlist
                   * sizeof (struct link_map *)));
     }
-  else if (GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist + to_add
-          > GL(dl_ns)[new->l_ns]._ns_global_scope_alloc)
+  else if (ns->_ns_main_searchlist->r_nlist + to_add
+          > ns->_ns_global_scope_alloc)
     {
       /* We have to extend the existing array of link maps in the
         main map.  */
       new_global = (struct link_map **)
-       realloc (GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list,
-                ((GL(dl_ns)[new->l_ns]._ns_global_scope_alloc + to_add + 8)
+       realloc (ns->_ns_main_searchlist->r_list,
+                ((ns->_ns_global_scope_alloc + to_add + 8)
                  * sizeof (struct link_map *)));
       if (new_global == NULL)
        goto nomem;
 
-      GL(dl_ns)[new->l_ns]._ns_global_scope_alloc += to_add + 8;
-      GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list = new_global;
+      ns->_ns_global_scope_alloc += to_add + 8;
+      ns->_ns_main_searchlist->r_list = new_global;
     }
 
   /* Now add the new entries.  */
+  unsigned int new_nlist = ns->_ns_main_searchlist->r_nlist;
   for (cnt = 0; cnt < new->l_searchlist.r_nlist; ++cnt)
     {
       struct link_map *map = new->l_searchlist.r_list[cnt];
@@ -145,11 +145,11 @@ add_to_global (struct link_map *new)
       if (map->l_global == 0)
        {
          map->l_global = 1;
-         GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_list[GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist]
-           = map;
-         ++GL(dl_ns)[new->l_ns]._ns_main_searchlist->r_nlist;
+         ns->_ns_main_searchlist->r_list[new_nlist++] = map;
        }
     }
+  atomic_write_barrier ();
+  ns->_ns_main_searchlist->r_nlist = new_nlist;
 
   return 0;
 }
index b38bb17..f04611d 100644 (file)
@@ -3,5 +3,5 @@ glibc-branch := fedora
 glibc-base := HEAD
 DIST_BRANCH := devel
 COLLECTION := dist-fc7
-fedora-sync-date := 2007-05-10 23:08 UTC
-fedora-sync-tag := fedora-glibc-20070510T2308
+fedora-sync-date := 2007-05-15 20:25 UTC
+fedora-sync-tag := fedora-glibc-20070515T2025
index 4eb49a9..0fd14d2 100644 (file)
@@ -1,5 +1,4 @@
-/* Copyright (C) 1991,1992,1993,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006
-       Free Software Foundation, Inc.
+/* Copyright (C) 1991,1992,1993,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
 /* Major and minor version number of the GNU C library package.  Use
    these macros to test for features in specific releases.  */
 #define        __GLIBC__       2
-#define        __GLIBC_MINOR__ 5
+#define        __GLIBC_MINOR__ 6
 
 #define __GLIBC_PREREQ(maj, min) \
        ((__GLIBC__ << 16) + __GLIBC_MINOR__ >= ((maj) << 16) + (min))
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 ce64335..9e3ff47 100644 (file)
@@ -370,6 +370,9 @@ ptmalloc_init_minimal (void)
   mp_.top_pad        = DEFAULT_TOP_PAD;
 #endif
   mp_.n_mmaps_max    = DEFAULT_MMAP_MAX;
+#if MALLOC_DEBUG
+  mp_.n_mmaps_cmax   = DEFAULT_MMAP_MAX;
+#endif
   mp_.mmap_threshold = DEFAULT_MMAP_THRESHOLD;
   mp_.trim_threshold = DEFAULT_TRIM_THRESHOLD;
   mp_.pagesize       = malloc_getpagesize;
index 8346e73..cde3e18 100644 (file)
@@ -1,5 +1,5 @@
 /* Malloc implementation for multiple threads without lock contention.
-   Copyright (C) 2001,2002,2003,2004,2005,2006 Free Software Foundation, Inc.
+   Copyright (C) 2001-2006, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Wolfram Gloger <wg@malloc.de>, 2001.
 
@@ -507,6 +507,9 @@ struct malloc_save_state {
   unsigned long trim_threshold;
   unsigned long top_pad;
   unsigned int  n_mmaps_max;
+#if MALLOC_DEBUG
+  unsigned int  n_mmaps_cmax;
+#endif
   unsigned long mmap_threshold;
   int           check_action;
   unsigned long max_sbrked_mem;
@@ -550,6 +553,9 @@ public_gET_STATe(void)
   ms->trim_threshold = mp_.trim_threshold;
   ms->top_pad = mp_.top_pad;
   ms->n_mmaps_max = mp_.n_mmaps_max;
+#if MALLOC_DEBUG
+  ms->n_mmaps_cmax = mp_.n_mmaps_cmax;
+#endif
   ms->mmap_threshold = mp_.mmap_threshold;
   ms->check_action = check_action;
   ms->max_sbrked_mem = main_arena.max_system_mem;
@@ -621,6 +627,9 @@ public_sET_STATe(Void_t* msptr)
   mp_.trim_threshold = ms->trim_threshold;
   mp_.top_pad = ms->top_pad;
   mp_.n_mmaps_max = ms->n_mmaps_max;
+#if MALLOC_DEBUG
+  mp_.n_mmaps_cmax = ms->n_mmaps_cmax;
+#endif
   mp_.mmap_threshold = ms->mmap_threshold;
   check_action = ms->check_action;
   main_arena.max_system_mem = ms->max_sbrked_mem;
index 8ae941c..e061db9 100644 (file)
@@ -2125,22 +2125,37 @@ typedef struct malloc_chunk* mbinptr;
 
 #define NBINS             128
 #define NSMALLBINS         64
-#define SMALLBIN_WIDTH      8
-#define MIN_LARGE_SIZE    512
+#define SMALLBIN_WIDTH    MALLOC_ALIGNMENT
+#define MIN_LARGE_SIZE    (NSMALLBINS * SMALLBIN_WIDTH)
 
 #define in_smallbin_range(sz)  \
   ((unsigned long)(sz) < (unsigned long)MIN_LARGE_SIZE)
 
-#define smallbin_index(sz)     (((unsigned)(sz)) >> 3)
+#define smallbin_index(sz) \
+  (SMALLBIN_WIDTH == 16 ? (((unsigned)(sz)) >> 4) : (((unsigned)(sz)) >> 3))
 
-#define largebin_index(sz)                                                   \
-(((((unsigned long)(sz)) >>  6) <= 32)?  56 + (((unsigned long)(sz)) >>  6): \
+#define largebin_index_32(sz)                                                \
+(((((unsigned long)(sz)) >>  6) <= 38)?  56 + (((unsigned long)(sz)) >>  6): \
  ((((unsigned long)(sz)) >>  9) <= 20)?  91 + (((unsigned long)(sz)) >>  9): \
  ((((unsigned long)(sz)) >> 12) <= 10)? 110 + (((unsigned long)(sz)) >> 12): \
  ((((unsigned long)(sz)) >> 15) <=  4)? 119 + (((unsigned long)(sz)) >> 15): \
  ((((unsigned long)(sz)) >> 18) <=  2)? 124 + (((unsigned long)(sz)) >> 18): \
                                         126)
 
+// XXX It remains to be seen whether it is good to keep the widths of
+// XXX the buckets the same or whether it should be scaled by a factor
+// XXX of two as well.
+#define largebin_index_64(sz)                                                \
+(((((unsigned long)(sz)) >>  6) <= 48)?  48 + (((unsigned long)(sz)) >>  6): \
+ ((((unsigned long)(sz)) >>  9) <= 20)?  91 + (((unsigned long)(sz)) >>  9): \
+ ((((unsigned long)(sz)) >> 12) <= 10)? 110 + (((unsigned long)(sz)) >> 12): \
+ ((((unsigned long)(sz)) >> 15) <=  4)? 119 + (((unsigned long)(sz)) >> 15): \
+ ((((unsigned long)(sz)) >> 18) <=  2)? 124 + (((unsigned long)(sz)) >> 18): \
+                                        126)
+
+#define largebin_index(sz) \
+  (SIZE_SZ == 8 ? largebin_index_64 (sz) : largebin_index_32 (sz))
+
 #define bin_index(sz) \
  ((in_smallbin_range(sz)) ? smallbin_index(sz) : largebin_index(sz))
 
@@ -2343,6 +2358,9 @@ struct malloc_par {
   /* Memory map support */
   int              n_mmaps;
   int              n_mmaps_max;
+#if MALLOC_DEBUG
+  int              n_mmaps_cmax;
+#endif
   int              max_n_mmaps;
   /* the mmap_threshold is dynamic, until the user sets
      it manually, at which point we need to disable any
@@ -2858,7 +2876,8 @@ static void do_check_malloc_state(mstate av)
   assert(total <= (unsigned long)(mp_.max_total_mem));
   assert(mp_.n_mmaps >= 0);
 #endif
-  assert(mp_.n_mmaps <= mp_.n_mmaps_max);
+  assert(mp_.n_mmaps <= mp_.n_mmaps_cmax);
+  assert(mp_.n_mmaps_max <= mp_.n_mmaps_cmax);
   assert(mp_.n_mmaps <= mp_.max_n_mmaps);
 
   assert((unsigned long)(av->system_mem) <=
@@ -3456,6 +3475,13 @@ munmap_chunk(p) mchunkptr p;
     }
 
   mp_.n_mmaps--;
+#if MALLOC_DEBUG
+  if (mp_.n_mmaps_cmax > mp_.n_mmaps_max)
+    {
+      assert (mp_.n_mmaps_cmax == mp_.n_mmaps + 1);
+      mp_.n_mmaps_cmax = mp_.n_mmaps;
+    }
+#endif
   mp_.mmapped_mem -= total_size;
 
   int ret __attribute__ ((unused)) = munmap((char *)block, total_size);
@@ -5371,6 +5397,9 @@ mstate av; size_t n_elements; size_t* sizes; int opts; Void_t* chunks[];
   mp_.n_mmaps_max = 0;
   mem = _int_malloc(av, size);
   mp_.n_mmaps_max = mmx;   /* reset mmap */
+#if MALLOC_DEBUG
+  mp_.n_mmaps_cmax = mmx;
+#endif
   if (mem == 0)
     return 0;
 
@@ -5696,8 +5725,17 @@ int mALLOPt(param_number, value) int param_number; int value;
       res = 0;
     else
 #endif
-      mp_.n_mmaps_max = value;
-      mp_.no_dyn_threshold = 1;
+      {
+#if MALLOC_DEBUG
+       if (mp_.n_mmaps <= value)
+         mp_.n_mmaps_cmax = value;
+       else
+         mp_.n_mmaps_cmax = mp_.n_mmaps;
+#endif
+
+       mp_.n_mmaps_max = value;
+       mp_.no_dyn_threshold = 1;
+      }
     break;
 
   case M_CHECK_ACTION:
index 662c567..0671f4a 100644 (file)
@@ -1,3 +1,19 @@
+2007-05-14  Ulrich Drepper  <drepper@redhat.com>
+
+       * sysdeps/unix/sysv/linux/x86_64/sem_wait.S: Remove unnecessary
+       extra cancellation test.
+       * sysdeps/unix/sysv/linux/x86_64/sem_timedwait.S: Likewise.
+
+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.
+       * sysdeps/unix/sysv/linux/x86_64/pthread_setaffinity.c: New file.
+
 2007-05-10  Jakub Jelinek  <jakub@redhat.com>
 
        [BZ #4455]
index d597176..70b8fe4 100644 (file)
--- a/nptl/TODO
+++ b/nptl/TODO
@@ -14,3 +14,18 @@ syscall needed.
 
 - test with threaded process terminating and semadj (?) being applied
   only after all threads are gone
+
+
+
+- semaphore changes:
+
+  - sem_post should only wake one thread and only when the state of
+    the semaphore changed from 0 to 1
+
+    this also requires that sem_wait and sem_timedwait don't drop the
+    post if they get canceled.
+
+  - possibly add counter field.  This requires reviving the
+    differences between old and new semaphose funtions.  The old ones
+    stay as they are now.  The new once can use an additional field
+    wich is the counter for the number of waiters
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 3776e26..fa0f46f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003, 2004, 2006 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2003.
 
@@ -79,6 +79,12 @@ __pthread_setaffinity_new (pthread_t th, size_t cpusetsize,
 
   res = INTERNAL_SYSCALL (sched_setaffinity, err, 3, pd->tid, cpusetsize,
                          cpuset);
+
+#ifdef RESET_VGETCPU_CACHE
+  if (!INTERNAL_SYSCALL_ERROR_P (res, err))
+    RESET_VGETCPU_CACHE ();
+#endif
+
   return (INTERNAL_SYSCALL_ERROR_P (res, err)
          ? INTERNAL_SYSCALL_ERRNO (res, err)
          : 0);
diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_setaffinity.c b/nptl/sysdeps/unix/sysv/linux/x86_64/pthread_setaffinity.c
new file mode 100644 (file)
index 0000000..640d304
--- /dev/null
@@ -0,0 +1,14 @@
+#include <tls.h>
+
+#define RESET_VGETCPU_CACHE() \
+  do {                       \
+    asm volatile ("movl %0, %%fs:%P1\n\t"                                    \
+                 "movl %0, %%fs:%P2"                                         \
+                 :                                                           \
+                 : "ir" (0), "i" (offsetof (struct pthread,                  \
+                                            header.vgetcpu_cache[0])),       \
+                   "i" (offsetof (struct pthread,                            \
+                                  header.vgetcpu_cache[1])));          \
+  } while (0)
+
+#include "../pthread_setaffinity.c"
index c44d3f5..76a566b 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
        .align  16
        cfi_startproc
 sem_timedwait:
-       /* First check for cancellation.  */
-       movl    %fs:CANCELHANDLING, %eax
-       andl    $0xfffffff9, %eax
-       cmpl    $8, %eax
-       je      11f
-
        movl    (%rdi), %eax
 2:     testl   %eax, %eax
        je      1f
@@ -160,16 +154,5 @@ sem_timedwait:
 
        orl     $-1, %eax
        jmp     10b
-       cfi_adjust_cfa_offset(-48)
-       cfi_restore(14)
-       cfi_restore(13)
-       cfi_restore(12)
-
-11:    /* Canceled.  */
-       movq    $0xffffffffffffffff, %fs:RESULT
-       LOCK
-       orl     $0x10, %fs:CANCELHANDLING
-       movq    %fs:CLEANUP_JMP_BUF, %rdi
-       jmp     HIDDEN_JUMPTARGET (__pthread_unwind)
        cfi_endproc
        .size   sem_timedwait,.-sem_timedwait
index 63ecd06..5bd78eb 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2005, 2007 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
 
        .align  16
        cfi_startproc
 sem_wait:
-       /* First check for cancellation.  */
-       movl    %fs:CANCELHANDLING, %eax
-       andl    $0xfffffff9, %eax
-       cmpl    $8, %eax
-       je      4f
-
        pushq   %r12
        cfi_adjust_cfa_offset(8)
        cfi_offset(12, -16)
@@ -109,12 +103,5 @@ sem_wait:
        cfi_restore(12)
 
        retq
-
-4:     /* Canceled.  */
-       movq    $0xffffffffffffffff, %fs:RESULT
-       LOCK
-       orl     $0x10, %fs:CANCELHANDLING
-       movq    %fs:CLEANUP_JMP_BUF, %rdi
-       jmp     HIDDEN_JUMPTARGET (__pthread_unwind)
        cfi_endproc
        .size   sem_wait,.-sem_wait
index b207f12..2864fe9 100755 (executable)
@@ -1,5 +1,5 @@
 #! /bin/bash
-# Copyright (C) 2003, 2005, 2006 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2005, 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
@@ -32,7 +32,7 @@
 #
 data=$1
 shift
-cxx="$*"
+cxx=$(echo $* | sed 's/-fgnu89-inline//')
 while read t; do
   echo -n "$t:"
   $cxx -S -xc++ -o - -D_GNU_SOURCE <(cat <<EOF
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)
index ccd3c8f..77cde47 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004, 2005, 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
@@ -67,7 +68,14 @@ __sched_setaffinity_new (pid_t pid, size_t cpusetsize, const cpu_set_t *cpuset)
        return -1;
       }
 
-  return INLINE_SYSCALL (sched_setaffinity, 3, pid, cpusetsize, cpuset);
+  int result = INLINE_SYSCALL (sched_setaffinity, 3, pid, cpusetsize, cpuset);
+
+#ifdef RESET_VGETCPU_CACHE
+  if (result != -1)
+    RESET_VGETCPU_CACHE ();
+#endif
+
+  return result;
 }
 versioned_symbol (libc, __sched_setaffinity_new, sched_setaffinity,
                  GLIBC_2_3_4);
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..bf3cb57
--- /dev/null
@@ -0,0 +1,54 @@
+#include <errno.h>
+#include <stdio.h>
+#include <sched.h>
+#include <unistd.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>
diff --git a/sysdeps/unix/sysv/linux/x86_64/sched_setaffinity.c b/sysdeps/unix/sysv/linux/x86_64/sched_setaffinity.c
new file mode 100644 (file)
index 0000000..d1101c5
--- /dev/null
@@ -0,0 +1,14 @@
+#include <tls.h>
+
+#define RESET_VGETCPU_CACHE() \
+  do {                       \
+    asm volatile ("movl %0, %%fs:%P1\n\t"                                    \
+                 "movl %0, %%fs:%P2"                                         \
+                 :                                                           \
+                 : "ir" (0), "i" (offsetof (struct pthread,                  \
+                                            header.vgetcpu_cache[0])),       \
+                   "i" (offsetof (struct pthread,                            \
+                                  header.vgetcpu_cache[1])));          \
+  } while (0)
+
+#include "../sched_setaffinity.c"
index acd0ed1..d70070f 100644 (file)
--- a/version.h
+++ b/version.h
@@ -1,4 +1,4 @@
 /* This file just defines the current version number of libc.  */
 
-#define RELEASE "development"
-#define VERSION "2.5.90"
+#define RELEASE "stable"
+#define VERSION "2.6"