1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
This malloc is based on Doug Lea's malloc ( ftp://gee.cs.oswego.edu/pub/misc/ ), the changes
are listed below. See http://lists.kde.org/?l=kde-core-devel&m=101351949010285&w=2 for details.
Basically, it's here because for now it has better performance than both glibc-2.2.x and
FreeBSD's libc.
There's a new configure switch, --enable-fast-malloc. By default it's turned off, disabling
the system libc one and using this one. Using --enable-fast-malloc=full enables this
malloc unconditionally, aiming for the maximum performance. By using only --enable-fast-malloc,
it's possible to select both malloc implementations at runtime. When $TDE_MALLOC is set to 0,
the system libc malloc is used, otherwise this malloc is used.
For now, the requirements are :
- x86 CPU (because of the spinlock implementation in assembler), it should be easy to add
new ones
- glibc (for --enable-fast-malloc=yes, =full doesn't need it), because it needs to refer
to the libc implementation of malloc (__libc_malloc etc.)
- gcc (for __inline__ , nothing else should depend on gcc)
If you have any problem with this malloc, try first using --enable-fast-malloc=debug and
recompiling libtdecore, or use valgrind. This malloc seems to be more vulnerable to heap
corruption, such as deleting a block twice, so faulty code may run without problems
with standard malloc shipped with your libc, but it will crash with this malloc. In case
you think there's any problem with this malloc, please mail me.
changes (against malloc-2.7.0):
#define USE_MALLOC_LOCK
#define INLINE __inline__
#define USE_MEMCPY 0
#define MMAP_CLEARS 1
made all functions INLINE
added #ifdef TDE_MALLOC_DEBUG -> #define DEBUG
reordered all functions in order to avoid 'warning: `XYZ' declared inline after being called'
especially moved the public_* ones at the end of the file
commented out #including malloc.h
added #include <config.h> at the top and enclosed whole file in #ifdef TDE_MALLOC
taken posix_memalign() from glibc
removed public icalloc(),icomalloc(),mtrim(),musable() (they don't exist everywhere anyway)
enclosed the pthreads part by #if 0 and replaced it with spinlock from glibc CVS (in x86.h)
also added :
----------
static mutex_t spinlock = MUTEX_INITIALIZER;
#define MALLOC_PREACTION lock( &spinlock )
#define MALLOC_POSTACTION unlock( &spinlock )
----------
public functions call either functions in this malloc or in libc, depending on $TDE_MALLOC
the kde_malloc_is_used hack
TODO:
malloc_set_state/malloc_get_state ?
Lubos Lunak <[email protected]>
|