diff options
author | Ulrich Drepper <drepper@redhat.com> | 2009-07-27 13:23:00 -0700 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2009-07-27 13:23:00 -0700 |
commit | 87cfd82a1fc269635c9b0dd37c47470b5465e775 (patch) | |
tree | a1867085d05cc16cf2939393a25d16f0079e3daf /elf/dl-scope.c | |
parent | 2d0671cbbdade9013d6fd5153d01bd5e1d3f60cb (diff) | |
download | glibc-87cfd82a1fc269635c9b0dd37c47470b5465e775.tar.gz glibc-87cfd82a1fc269635c9b0dd37c47470b5465e775.tar.xz glibc-87cfd82a1fc269635c9b0dd37c47470b5465e775.zip |
Break out _dl_scope_free into its own file.
This reduces the coarse static callgraph that can be discovered by looking at the object files.
Diffstat (limited to 'elf/dl-scope.c')
-rw-r--r-- | elf/dl-scope.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/elf/dl-scope.c b/elf/dl-scope.c new file mode 100644 index 0000000000..229177ed34 --- /dev/null +++ b/elf/dl-scope.c @@ -0,0 +1,58 @@ +/* Memory handling for the scope data structures. + Copyright (C) 2009 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <stdlib.h> +#include <ldsodefs.h> +#include <sysdep-cancel.h> + + +int +_dl_scope_free (void *old) +{ + struct dl_scope_free_list *fsl; +#define DL_SCOPE_FREE_LIST_SIZE (sizeof (fsl->list) / sizeof (fsl->list[0])) + + if (RTLD_SINGLE_THREAD_P) + free (old); + else if ((fsl = GL(dl_scope_free_list)) == NULL) + { + GL(dl_scope_free_list) = fsl = malloc (sizeof (*fsl)); + if (fsl == NULL) + { + THREAD_GSCOPE_WAIT (); + free (old); + return 1; + } + else + { + fsl->list[0] = old; + fsl->count = 1; + } + } + else if (fsl->count < DL_SCOPE_FREE_LIST_SIZE) + fsl->list[fsl->count++] = old; + else + { + THREAD_GSCOPE_WAIT (); + while (fsl->count > 0) + free (fsl->list[--fsl->count]); + return 1; + } + return 0; +} |