mirror of
git://sourceware.org/git/glibc.git
synced 2024-12-09 04:11:27 +08:00
5bc17330eb
The dynamic linker currently uses __libc_memalign for TLS-related allocations. The goal is to switch to malloc instead. If the minimal malloc follows the ABI fundamental alignment, we can assume that malloc provides this alignment, and thus skip explicit alignment in a few cases as an optimization. It was requested on libc-alpha that MALLOC_ALIGNMENT should be used, although this results in wasted space if MALLOC_ALIGNMENT is larger than the fundamental alignment. (The dynamic linker cannot assume that the non-minimal malloc will provide an alignment of MALLOC_ALIGNMENT; the ABI provides _Alignof (max_align_t) only.)
86 lines
3.5 KiB
C
86 lines
3.5 KiB
C
/* Internal declarations for malloc, for use within libc.
|
|
Copyright (C) 2016 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; see the file COPYING.LIB. If
|
|
not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef _MALLOC_INTERNAL_H
|
|
#define _MALLOC_INTERNAL_H
|
|
|
|
#include <malloc-machine.h>
|
|
#include <malloc-sysdep.h>
|
|
|
|
/* INTERNAL_SIZE_T is the word-size used for internal bookkeeping of
|
|
chunk sizes.
|
|
|
|
The default version is the same as size_t.
|
|
|
|
While not strictly necessary, it is best to define this as an
|
|
unsigned type, even if size_t is a signed type. This may avoid some
|
|
artificial size limitations on some systems.
|
|
|
|
On a 64-bit machine, you may be able to reduce malloc overhead by
|
|
defining INTERNAL_SIZE_T to be a 32 bit `unsigned int' at the
|
|
expense of not being able to handle more than 2^32 of malloced
|
|
space. If this limitation is acceptable, you are encouraged to set
|
|
this unless you are on a platform requiring 16byte alignments. In
|
|
this case the alignment requirements turn out to negate any
|
|
potential advantages of decreasing size_t word size.
|
|
|
|
Implementors: Beware of the possible combinations of:
|
|
- INTERNAL_SIZE_T might be signed or unsigned, might be 32 or 64 bits,
|
|
and might be the same width as int or as long
|
|
- size_t might have different width and signedness as INTERNAL_SIZE_T
|
|
- int and long might be 32 or 64 bits, and might be the same width
|
|
|
|
To deal with this, most comparisons and difference computations
|
|
among INTERNAL_SIZE_Ts should cast them to unsigned long, being
|
|
aware of the fact that casting an unsigned int to a wider long does
|
|
not sign-extend. (This also makes checking for negative numbers
|
|
awkward.) Some of these casts result in harmless compiler warnings
|
|
on some systems. */
|
|
#ifndef INTERNAL_SIZE_T
|
|
# define INTERNAL_SIZE_T size_t
|
|
#endif
|
|
|
|
/* The corresponding word size. */
|
|
#define SIZE_SZ (sizeof (INTERNAL_SIZE_T))
|
|
|
|
/* MALLOC_ALIGNMENT is the minimum alignment for malloc'ed chunks. It
|
|
must be a power of two at least 2 * SIZE_SZ, even on machines for
|
|
which smaller alignments would suffice. It may be defined as larger
|
|
than this though. Note however that code and data structures are
|
|
optimized for the case of 8-byte alignment. */
|
|
#ifndef MALLOC_ALIGNMENT
|
|
# define MALLOC_ALIGNMENT (2 * SIZE_SZ < __alignof__ (long double) \
|
|
? __alignof__ (long double) : 2 * SIZE_SZ)
|
|
#endif
|
|
|
|
/* The corresponding bit mask value. */
|
|
#define MALLOC_ALIGN_MASK (MALLOC_ALIGNMENT - 1)
|
|
|
|
|
|
/* Called in the parent process before a fork. */
|
|
void __malloc_fork_lock_parent (void) internal_function attribute_hidden;
|
|
|
|
/* Called in the parent process after a fork. */
|
|
void __malloc_fork_unlock_parent (void) internal_function attribute_hidden;
|
|
|
|
/* Called in the child process after a fork. */
|
|
void __malloc_fork_unlock_child (void) internal_function attribute_hidden;
|
|
|
|
|
|
#endif /* _MALLOC_INTERNAL_H */
|