utilities/standaloneallocator/dla_p.h
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
hgs
parents:
diff changeset
     1
/****************************************************************************
hgs
parents:
diff changeset
     2
**
hgs
parents:
diff changeset
     3
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     4
 *
hgs
parents:
diff changeset
     5
 * This file is part of Qt Web Runtime.
hgs
parents:
diff changeset
     6
 *
hgs
parents:
diff changeset
     7
 * This library is free software; you can redistribute it and/or
hgs
parents:
diff changeset
     8
 * modify it under the terms of the GNU Lesser General Public License
hgs
parents:
diff changeset
     9
 * version 2.1 as published by the Free Software Foundation.
hgs
parents:
diff changeset
    10
 *
hgs
parents:
diff changeset
    11
 * This library is distributed in the hope that it will be useful,
hgs
parents:
diff changeset
    12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
hgs
parents:
diff changeset
    14
 * Lesser General Public License for more details.
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 * You should have received a copy of the GNU Lesser General Public
hgs
parents:
diff changeset
    17
 * License along with this library; if not, write to the Free Software
hgs
parents:
diff changeset
    18
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
hgs
parents:
diff changeset
    19
 *
hgs
parents:
diff changeset
    20
 */
hgs
parents:
diff changeset
    21
#ifndef __DLA__
hgs
parents:
diff changeset
    22
#define __DLA__
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#define DEFAULT_TRIM_THRESHOLD ((size_t)4U * (size_t)1024U)
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
#define __SYMBIAN__
hgs
parents:
diff changeset
    27
#define MSPACES 0
hgs
parents:
diff changeset
    28
#define HAVE_MORECORE 1
hgs
parents:
diff changeset
    29
#define MORECORE_CONTIGUOUS 1
hgs
parents:
diff changeset
    30
#define HAVE_MMAP 0
hgs
parents:
diff changeset
    31
#define HAVE_MREMAP 0
hgs
parents:
diff changeset
    32
#define DEFAULT_GRANULARITY (4096U)
hgs
parents:
diff changeset
    33
#define FOOTERS 0
hgs
parents:
diff changeset
    34
#define USE_LOCKS 0
hgs
parents:
diff changeset
    35
#define INSECURE 1
hgs
parents:
diff changeset
    36
#define NO_MALLINFO 0
hgs
parents:
diff changeset
    37
#define HAVE_GETPAGESIZE
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
#define LACKS_SYS_TYPES_H
hgs
parents:
diff changeset
    40
#ifndef LACKS_SYS_TYPES_H
hgs
parents:
diff changeset
    41
#include <sys/types.h>  /* For size_t */
hgs
parents:
diff changeset
    42
#else
hgs
parents:
diff changeset
    43
#ifndef _SIZE_T_DECLARED
hgs
parents:
diff changeset
    44
typedef unsigned int size_t;
hgs
parents:
diff changeset
    45
#define _SIZE_T_DECLARED
hgs
parents:
diff changeset
    46
#endif
hgs
parents:
diff changeset
    47
#endif  /* LACKS_SYS_TYPES_H */
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
/* The maximum possible size_t value has all bits set */
hgs
parents:
diff changeset
    50
#define MAX_SIZE_T           (~(size_t)0)
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
#ifndef ONLY_MSPACES
hgs
parents:
diff changeset
    53
    #define ONLY_MSPACES 0
hgs
parents:
diff changeset
    54
#endif  /* ONLY_MSPACES */
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
#ifndef MSPACES
hgs
parents:
diff changeset
    57
    #if ONLY_MSPACES
hgs
parents:
diff changeset
    58
        #define MSPACES 1
hgs
parents:
diff changeset
    59
    #else   /* ONLY_MSPACES */
hgs
parents:
diff changeset
    60
        #define MSPACES 0
hgs
parents:
diff changeset
    61
    #endif  /* ONLY_MSPACES */
hgs
parents:
diff changeset
    62
#endif  /* MSPACES */
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
#ifndef MALLOC_ALIGNMENT
hgs
parents:
diff changeset
    65
    #define MALLOC_ALIGNMENT ((size_t)8U)
hgs
parents:
diff changeset
    66
#endif  /* MALLOC_ALIGNMENT */
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
#ifndef FOOTERS
hgs
parents:
diff changeset
    69
    #define FOOTERS 0
hgs
parents:
diff changeset
    70
#endif  /* FOOTERS */
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
#ifndef ABORT
hgs
parents:
diff changeset
    73
//  #define ABORT  abort()
hgs
parents:
diff changeset
    74
    #define ABORT  User::Invariant()// redefined so euser isn't dependant on oe
hgs
parents:
diff changeset
    75
#endif  /* ABORT */
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
#ifndef ABORT_ON_ASSERT_FAILURE
hgs
parents:
diff changeset
    78
    #define ABORT_ON_ASSERT_FAILURE 1
hgs
parents:
diff changeset
    79
#endif  /* ABORT_ON_ASSERT_FAILURE */
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
#ifndef PROCEED_ON_ERROR
hgs
parents:
diff changeset
    82
    #define PROCEED_ON_ERROR 0
hgs
parents:
diff changeset
    83
#endif  /* PROCEED_ON_ERROR */
hgs
parents:
diff changeset
    84
hgs
parents:
diff changeset
    85
#ifndef USE_LOCKS
hgs
parents:
diff changeset
    86
    #define USE_LOCKS 0
hgs
parents:
diff changeset
    87
#endif  /* USE_LOCKS */
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
#ifndef INSECURE
hgs
parents:
diff changeset
    90
    #define INSECURE 0
hgs
parents:
diff changeset
    91
#endif  /* INSECURE */
hgs
parents:
diff changeset
    92
hgs
parents:
diff changeset
    93
#ifndef HAVE_MMAP
hgs
parents:
diff changeset
    94
    #define HAVE_MMAP 1
hgs
parents:
diff changeset
    95
#endif  /* HAVE_MMAP */
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
#ifndef MMAP_CLEARS
hgs
parents:
diff changeset
    98
    #define MMAP_CLEARS 1
hgs
parents:
diff changeset
    99
#endif  /* MMAP_CLEARS */
hgs
parents:
diff changeset
   100
hgs
parents:
diff changeset
   101
#ifndef HAVE_MREMAP
hgs
parents:
diff changeset
   102
    #ifdef linux
hgs
parents:
diff changeset
   103
        #define HAVE_MREMAP 1
hgs
parents:
diff changeset
   104
    #else   /* linux */
hgs
parents:
diff changeset
   105
        #define HAVE_MREMAP 0
hgs
parents:
diff changeset
   106
    #endif  /* linux */
hgs
parents:
diff changeset
   107
#endif  /* HAVE_MREMAP */
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
#ifndef MALLOC_FAILURE_ACTION
hgs
parents:
diff changeset
   110
    //#define MALLOC_FAILURE_ACTION  errno = ENOMEM;
hgs
parents:
diff changeset
   111
    #define MALLOC_FAILURE_ACTION ;
hgs
parents:
diff changeset
   112
#endif  /* MALLOC_FAILURE_ACTION */
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
#ifndef HAVE_MORECORE
hgs
parents:
diff changeset
   115
    #if ONLY_MSPACES
hgs
parents:
diff changeset
   116
        #define HAVE_MORECORE 1 /*AMOD: has changed */
hgs
parents:
diff changeset
   117
    #else   /* ONLY_MSPACES */
hgs
parents:
diff changeset
   118
        #define HAVE_MORECORE 1
hgs
parents:
diff changeset
   119
    #endif  /* ONLY_MSPACES */
hgs
parents:
diff changeset
   120
#endif  /* HAVE_MORECORE */
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
#if !HAVE_MORECORE
hgs
parents:
diff changeset
   123
    #define MORECORE_CONTIGUOUS 0
hgs
parents:
diff changeset
   124
#else   /* !HAVE_MORECORE */
hgs
parents:
diff changeset
   125
    #ifndef MORECORE
hgs
parents:
diff changeset
   126
        #define MORECORE DLAdjust
hgs
parents:
diff changeset
   127
    #endif  /* MORECORE */
hgs
parents:
diff changeset
   128
    #ifndef MORECORE_CONTIGUOUS
hgs
parents:
diff changeset
   129
        #define MORECORE_CONTIGUOUS 0
hgs
parents:
diff changeset
   130
    #endif  /* MORECORE_CONTIGUOUS */
hgs
parents:
diff changeset
   131
#endif  /* !HAVE_MORECORE */
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
#ifndef DEFAULT_GRANULARITY
hgs
parents:
diff changeset
   134
    #if MORECORE_CONTIGUOUS
hgs
parents:
diff changeset
   135
        #define DEFAULT_GRANULARITY 4096  /* 0 means to compute in init_mparams */
hgs
parents:
diff changeset
   136
    #else   /* MORECORE_CONTIGUOUS */
hgs
parents:
diff changeset
   137
        #define DEFAULT_GRANULARITY ((size_t)64U * (size_t)1024U)
hgs
parents:
diff changeset
   138
    #endif  /* MORECORE_CONTIGUOUS */
hgs
parents:
diff changeset
   139
#endif  /* DEFAULT_GRANULARITY */
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
#ifndef DEFAULT_TRIM_THRESHOLD
hgs
parents:
diff changeset
   142
    #ifndef MORECORE_CANNOT_TRIM
hgs
parents:
diff changeset
   143
        #define DEFAULT_TRIM_THRESHOLD ((size_t)2U * (size_t)1024U * (size_t)1024U)
hgs
parents:
diff changeset
   144
    #else   /* MORECORE_CANNOT_TRIM */
hgs
parents:
diff changeset
   145
        #define DEFAULT_TRIM_THRESHOLD MAX_SIZE_T
hgs
parents:
diff changeset
   146
    #endif  /* MORECORE_CANNOT_TRIM */
hgs
parents:
diff changeset
   147
#endif  /* DEFAULT_TRIM_THRESHOLD */
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
#ifndef DEFAULT_MMAP_THRESHOLD
hgs
parents:
diff changeset
   150
    #if HAVE_MMAP
hgs
parents:
diff changeset
   151
        #define DEFAULT_MMAP_THRESHOLD ((size_t)256U * (size_t)1024U)
hgs
parents:
diff changeset
   152
    #else   /* HAVE_MMAP */
hgs
parents:
diff changeset
   153
        #define DEFAULT_MMAP_THRESHOLD MAX_SIZE_T
hgs
parents:
diff changeset
   154
    #endif  /* HAVE_MMAP */
hgs
parents:
diff changeset
   155
#endif  /* DEFAULT_MMAP_THRESHOLD */
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
#ifndef USE_BUILTIN_FFS
hgs
parents:
diff changeset
   158
    #define USE_BUILTIN_FFS 0
hgs
parents:
diff changeset
   159
#endif  /* USE_BUILTIN_FFS */
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
#ifndef USE_DEV_RANDOM
hgs
parents:
diff changeset
   162
    #define USE_DEV_RANDOM 0
hgs
parents:
diff changeset
   163
#endif  /* USE_DEV_RANDOM */
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
#ifndef NO_MALLINFO
hgs
parents:
diff changeset
   166
    #define NO_MALLINFO 0
hgs
parents:
diff changeset
   167
#endif  /* NO_MALLINFO */
hgs
parents:
diff changeset
   168
#ifndef MALLINFO_FIELD_TYPE
hgs
parents:
diff changeset
   169
    #define MALLINFO_FIELD_TYPE size_t
hgs
parents:
diff changeset
   170
#endif  /* MALLINFO_FIELD_TYPE */
hgs
parents:
diff changeset
   171
hgs
parents:
diff changeset
   172
/*
hgs
parents:
diff changeset
   173
  mallopt tuning options.  SVID/XPG defines four standard parameter
hgs
parents:
diff changeset
   174
  numbers for mallopt, normally defined in malloc.h.  None of these
hgs
parents:
diff changeset
   175
  are used in this malloc, so setting them has no effect. But this
hgs
parents:
diff changeset
   176
  malloc does support the following options.
hgs
parents:
diff changeset
   177
*/
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
#define M_TRIM_THRESHOLD     (-1)
hgs
parents:
diff changeset
   180
#define M_GRANULARITY        (-2)
hgs
parents:
diff changeset
   181
#define M_MMAP_THRESHOLD     (-3)
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
#if !NO_MALLINFO
hgs
parents:
diff changeset
   184
/*
hgs
parents:
diff changeset
   185
  This version of malloc supports the standard SVID/XPG mallinfo
hgs
parents:
diff changeset
   186
  routine that returns a struct containing usage properties and
hgs
parents:
diff changeset
   187
  statistics. It should work on any system that has a
hgs
parents:
diff changeset
   188
  /usr/include/malloc.h defining struct mallinfo.  The main
hgs
parents:
diff changeset
   189
  declaration needed is the mallinfo struct that is returned (by-copy)
hgs
parents:
diff changeset
   190
  by mallinfo().  The malloinfo struct contains a bunch of fields that
hgs
parents:
diff changeset
   191
  are not even meaningful in this version of malloc.  These fields are
hgs
parents:
diff changeset
   192
  are instead filled by mallinfo() with other numbers that might be of
hgs
parents:
diff changeset
   193
  interest.
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
  HAVE_USR_INCLUDE_MALLOC_H should be set if you have a
hgs
parents:
diff changeset
   196
  /usr/include/malloc.h file that includes a declaration of struct
hgs
parents:
diff changeset
   197
  mallinfo.  If so, it is included; else a compliant version is
hgs
parents:
diff changeset
   198
  declared below.  These must be precisely the same for mallinfo() to
hgs
parents:
diff changeset
   199
  work.  The original SVID version of this struct, defined on most
hgs
parents:
diff changeset
   200
  systems with mallinfo, declares all fields as ints. But some others
hgs
parents:
diff changeset
   201
  define as unsigned long. If your system defines the fields using a
hgs
parents:
diff changeset
   202
  type of different width than listed here, you MUST #include your
hgs
parents:
diff changeset
   203
  system version and #define HAVE_USR_INCLUDE_MALLOC_H.
hgs
parents:
diff changeset
   204
*/
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
/* #define HAVE_USR_INCLUDE_MALLOC_H */
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
#ifdef HAVE_USR_INCLUDE_MALLOC_H
hgs
parents:
diff changeset
   209
#include "/usr/include/malloc.h"
hgs
parents:
diff changeset
   210
#else /* HAVE_USR_INCLUDE_MALLOC_H */
hgs
parents:
diff changeset
   211
hgs
parents:
diff changeset
   212
struct mallinfo {
hgs
parents:
diff changeset
   213
  MALLINFO_FIELD_TYPE arena;    /* non-mmapped space allocated from system */
hgs
parents:
diff changeset
   214
  MALLINFO_FIELD_TYPE ordblks;  /* number of free chunks */
hgs
parents:
diff changeset
   215
  MALLINFO_FIELD_TYPE smblks;   /* always 0 */
hgs
parents:
diff changeset
   216
  MALLINFO_FIELD_TYPE hblks;    /* always 0 */
hgs
parents:
diff changeset
   217
  MALLINFO_FIELD_TYPE hblkhd;   /* space in mmapped regions */
hgs
parents:
diff changeset
   218
  MALLINFO_FIELD_TYPE usmblks;  /* maximum total allocated space */
hgs
parents:
diff changeset
   219
  MALLINFO_FIELD_TYPE fsmblks;  /* always 0 */
hgs
parents:
diff changeset
   220
  MALLINFO_FIELD_TYPE uordblks; /* total allocated space */
hgs
parents:
diff changeset
   221
  MALLINFO_FIELD_TYPE fordblks; /* total free space */
hgs
parents:
diff changeset
   222
  MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */
hgs
parents:
diff changeset
   223
  MALLINFO_FIELD_TYPE cellCount;/* Number of chunks allocated*/
hgs
parents:
diff changeset
   224
  MALLINFO_FIELD_TYPE largestBlock;
hgs
parents:
diff changeset
   225
};
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
#endif /* HAVE_USR_INCLUDE_MALLOC_H */
hgs
parents:
diff changeset
   228
#endif /* NO_MALLINFO */
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
#if MSPACES
hgs
parents:
diff changeset
   231
    typedef void* mspace;
hgs
parents:
diff changeset
   232
#endif /* MSPACES */
hgs
parents:
diff changeset
   233
hgs
parents:
diff changeset
   234
#ifndef __SYMBIAN__
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
#include <stdio.h>/* for printing in malloc_stats */
hgs
parents:
diff changeset
   237
hgs
parents:
diff changeset
   238
#ifndef LACKS_ERRNO_H
hgs
parents:
diff changeset
   239
    #include <errno.h>       /* for MALLOC_FAILURE_ACTION */
hgs
parents:
diff changeset
   240
#endif /* LACKS_ERRNO_H */
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
#if FOOTERS
hgs
parents:
diff changeset
   243
    #include <time.h>        /* for magic initialization */
hgs
parents:
diff changeset
   244
#endif /* FOOTERS */
hgs
parents:
diff changeset
   245
hgs
parents:
diff changeset
   246
#ifndef LACKS_STDLIB_H
hgs
parents:
diff changeset
   247
    #include <stdlib.h>      /* for abort() */
hgs
parents:
diff changeset
   248
#endif /* LACKS_STDLIB_H */
hgs
parents:
diff changeset
   249
hgs
parents:
diff changeset
   250
#ifdef DEBUG
hgs
parents:
diff changeset
   251
    #if ABORT_ON_ASSERT_FAILURE
hgs
parents:
diff changeset
   252
        #define assert(x) if (!(x)) ABORT
hgs
parents:
diff changeset
   253
    #else /* ABORT_ON_ASSERT_FAILURE */
hgs
parents:
diff changeset
   254
        #include <assert.h>
hgs
parents:
diff changeset
   255
    #endif /* ABORT_ON_ASSERT_FAILURE */
hgs
parents:
diff changeset
   256
#else  /* DEBUG */
hgs
parents:
diff changeset
   257
        #define assert(x)
hgs
parents:
diff changeset
   258
#endif /* DEBUG */
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
#ifndef LACKS_STRING_H
hgs
parents:
diff changeset
   261
    #include <string.h>      /* for memset etc */
hgs
parents:
diff changeset
   262
#endif  /* LACKS_STRING_H */
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
#if USE_BUILTIN_FFS
hgs
parents:
diff changeset
   265
    #ifndef LACKS_STRINGS_H
hgs
parents:
diff changeset
   266
        #include <strings.h>     /* for ffs */
hgs
parents:
diff changeset
   267
    #endif /* LACKS_STRINGS_H */
hgs
parents:
diff changeset
   268
#endif /* USE_BUILTIN_FFS */
hgs
parents:
diff changeset
   269
hgs
parents:
diff changeset
   270
#if HAVE_MMAP
hgs
parents:
diff changeset
   271
    #ifndef LACKS_SYS_MMAN_H
hgs
parents:
diff changeset
   272
        #include <sys/mman.h>    /* for mmap */
hgs
parents:
diff changeset
   273
    #endif /* LACKS_SYS_MMAN_H */
hgs
parents:
diff changeset
   274
    #ifndef LACKS_FCNTL_H
hgs
parents:
diff changeset
   275
        #include <fcntl.h>
hgs
parents:
diff changeset
   276
    #endif /* LACKS_FCNTL_H */
hgs
parents:
diff changeset
   277
#endif /* HAVE_MMAP */
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
#if HAVE_MORECORE
hgs
parents:
diff changeset
   280
    #ifndef LACKS_UNISTD_H
hgs
parents:
diff changeset
   281
        #include <unistd.h>     /* for sbrk */
hgs
parents:
diff changeset
   282
    extern void*     sbrk(size_t);
hgs
parents:
diff changeset
   283
    #else /* LACKS_UNISTD_H */
hgs
parents:
diff changeset
   284
        #if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__)
hgs
parents:
diff changeset
   285
            extern void*     sbrk(ptrdiff_t);
hgs
parents:
diff changeset
   286
            /*Amod sbrk is not defined in WIN32 need to check in symbian*/
hgs
parents:
diff changeset
   287
        #endif /* FreeBSD etc */
hgs
parents:
diff changeset
   288
    #endif /* LACKS_UNISTD_H */
hgs
parents:
diff changeset
   289
#endif /* HAVE_MORECORE */
hgs
parents:
diff changeset
   290
hgs
parents:
diff changeset
   291
#endif
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
#define assert(x)   ASSERT(x)
hgs
parents:
diff changeset
   294
hgs
parents:
diff changeset
   295
#ifndef WIN32
hgs
parents:
diff changeset
   296
    #ifndef malloc_getpagesize
hgs
parents:
diff changeset
   297
        #ifdef _SC_PAGESIZE         /* some SVR4 systems omit an underscore */
hgs
parents:
diff changeset
   298
            #ifndef _SC_PAGE_SIZE
hgs
parents:
diff changeset
   299
                #define _SC_PAGE_SIZE _SC_PAGESIZE
hgs
parents:
diff changeset
   300
            #endif
hgs
parents:
diff changeset
   301
        #endif
hgs
parents:
diff changeset
   302
        #ifdef _SC_PAGE_SIZE
hgs
parents:
diff changeset
   303
            #define malloc_getpagesize sysconf(_SC_PAGE_SIZE)
hgs
parents:
diff changeset
   304
        #else
hgs
parents:
diff changeset
   305
            #if defined(BSD) || defined(DGUX) || defined(HAVE_GETPAGESIZE)
hgs
parents:
diff changeset
   306
                extern size_t getpagesize();
hgs
parents:
diff changeset
   307
                #define malloc_getpagesize getpagesize()
hgs
parents:
diff changeset
   308
            #else
hgs
parents:
diff changeset
   309
                #ifdef WIN32 /* use supplied emulation of getpagesize */
hgs
parents:
diff changeset
   310
                    #define malloc_getpagesize getpagesize()
hgs
parents:
diff changeset
   311
                #else
hgs
parents:
diff changeset
   312
                    #ifndef LACKS_SYS_PARAM_H
hgs
parents:
diff changeset
   313
                        #include <sys/param.h>
hgs
parents:
diff changeset
   314
                    #endif
hgs
parents:
diff changeset
   315
                    #ifdef EXEC_PAGESIZE
hgs
parents:
diff changeset
   316
                        #define malloc_getpagesize EXEC_PAGESIZE
hgs
parents:
diff changeset
   317
                    #else
hgs
parents:
diff changeset
   318
                        #ifdef NBPG
hgs
parents:
diff changeset
   319
                            #ifndef CLSIZE
hgs
parents:
diff changeset
   320
                                #define malloc_getpagesize NBPG
hgs
parents:
diff changeset
   321
                            #else
hgs
parents:
diff changeset
   322
                                #define malloc_getpagesize (NBPG * CLSIZE)
hgs
parents:
diff changeset
   323
                            #endif
hgs
parents:
diff changeset
   324
                        #else
hgs
parents:
diff changeset
   325
                            #ifdef NBPC
hgs
parents:
diff changeset
   326
                                #define malloc_getpagesize NBPC
hgs
parents:
diff changeset
   327
                            #else
hgs
parents:
diff changeset
   328
                                #ifdef PAGESIZE
hgs
parents:
diff changeset
   329
                                    #define malloc_getpagesize PAGESIZE
hgs
parents:
diff changeset
   330
                                #else /* just guess */
hgs
parents:
diff changeset
   331
                                    #define malloc_getpagesize ((size_t)4096U)
hgs
parents:
diff changeset
   332
                                #endif
hgs
parents:
diff changeset
   333
                            #endif
hgs
parents:
diff changeset
   334
                        #endif
hgs
parents:
diff changeset
   335
                    #endif
hgs
parents:
diff changeset
   336
                #endif
hgs
parents:
diff changeset
   337
            #endif
hgs
parents:
diff changeset
   338
        #endif
hgs
parents:
diff changeset
   339
    #endif
hgs
parents:
diff changeset
   340
#endif
hgs
parents:
diff changeset
   341
hgs
parents:
diff changeset
   342
/* ------------------- size_t and alignment properties -------------------- */
hgs
parents:
diff changeset
   343
hgs
parents:
diff changeset
   344
/* The byte and bit size of a size_t */
hgs
parents:
diff changeset
   345
#define SIZE_T_SIZE         (sizeof(size_t))
hgs
parents:
diff changeset
   346
#define SIZE_T_BITSIZE      (sizeof(size_t) << 3)
hgs
parents:
diff changeset
   347
hgs
parents:
diff changeset
   348
/* Some constants coerced to size_t */
hgs
parents:
diff changeset
   349
/* Annoying but necessary to avoid errors on some plaftorms */
hgs
parents:
diff changeset
   350
#define SIZE_T_ZERO         ((size_t)0)
hgs
parents:
diff changeset
   351
#define SIZE_T_ONE          ((size_t)1)
hgs
parents:
diff changeset
   352
#define SIZE_T_TWO          ((size_t)2)
hgs
parents:
diff changeset
   353
#define TWO_SIZE_T_SIZES    (SIZE_T_SIZE<<1)
hgs
parents:
diff changeset
   354
#define FOUR_SIZE_T_SIZES   (SIZE_T_SIZE<<2)
hgs
parents:
diff changeset
   355
#define SIX_SIZE_T_SIZES    (FOUR_SIZE_T_SIZES+TWO_SIZE_T_SIZES)
hgs
parents:
diff changeset
   356
#define HALF_MAX_SIZE_T     (MAX_SIZE_T / 2U)
hgs
parents:
diff changeset
   357
hgs
parents:
diff changeset
   358
/* The bit mask value corresponding to MALLOC_ALIGNMENT */
hgs
parents:
diff changeset
   359
#define CHUNK_ALIGN_MASK    (MALLOC_ALIGNMENT - SIZE_T_ONE)
hgs
parents:
diff changeset
   360
hgs
parents:
diff changeset
   361
/* True if address a has acceptable alignment */
hgs
parents:
diff changeset
   362
//#define is_aligned(A)       (((size_t)((A)) & (CHUNK_ALIGN_MASK)) == 0)
hgs
parents:
diff changeset
   363
#define is_aligned(A)       (((unsigned int)((A)) & (CHUNK_ALIGN_MASK)) == 0)
hgs
parents:
diff changeset
   364
hgs
parents:
diff changeset
   365
/* the number of bytes to offset an address to align it */
hgs
parents:
diff changeset
   366
#define align_offset(A)\
hgs
parents:
diff changeset
   367
    ((((size_t)(A) & CHUNK_ALIGN_MASK) == 0)? 0 :\
hgs
parents:
diff changeset
   368
    ((MALLOC_ALIGNMENT - ((size_t)(A) & CHUNK_ALIGN_MASK)) & CHUNK_ALIGN_MASK))
hgs
parents:
diff changeset
   369
hgs
parents:
diff changeset
   370
/* -------------------------- MMAP preliminaries ------------------------- */
hgs
parents:
diff changeset
   371
hgs
parents:
diff changeset
   372
/*
hgs
parents:
diff changeset
   373
   If HAVE_MORECORE or HAVE_MMAP are false, we just define calls and
hgs
parents:
diff changeset
   374
   checks to fail so compiler optimizer can delete code rather than
hgs
parents:
diff changeset
   375
   using so many "#if"s.
hgs
parents:
diff changeset
   376
*/
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
hgs
parents:
diff changeset
   379
/* MORECORE and MMAP must return MFAIL on failure */
hgs
parents:
diff changeset
   380
#define MFAIL                ((void*)(MAX_SIZE_T))
hgs
parents:
diff changeset
   381
#define CMFAIL               ((TUint8*)(MFAIL)) /* defined for convenience */
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
#if !HAVE_MMAP
hgs
parents:
diff changeset
   384
    #define IS_MMAPPED_BIT       (SIZE_T_ZERO)
hgs
parents:
diff changeset
   385
    #define USE_MMAP_BIT         (SIZE_T_ZERO)
hgs
parents:
diff changeset
   386
    #define CALL_MMAP(s)         MFAIL
hgs
parents:
diff changeset
   387
    #define CALL_MUNMAP(a, s)    (-1)
hgs
parents:
diff changeset
   388
    #define DIRECT_MMAP(s)       MFAIL
hgs
parents:
diff changeset
   389
#else /* !HAVE_MMAP */
hgs
parents:
diff changeset
   390
    #define IS_MMAPPED_BIT       (SIZE_T_ONE)
hgs
parents:
diff changeset
   391
    #define USE_MMAP_BIT         (SIZE_T_ONE)
hgs
parents:
diff changeset
   392
        #ifndef WIN32
hgs
parents:
diff changeset
   393
            #define CALL_MUNMAP(a, s)    DLUMMAP((a),(s)) /*munmap((a), (s))*/
hgs
parents:
diff changeset
   394
            #define MMAP_PROT            (PROT_READ|PROT_WRITE)
hgs
parents:
diff changeset
   395
            #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
hgs
parents:
diff changeset
   396
                #define MAP_ANONYMOUS        MAP_ANON
hgs
parents:
diff changeset
   397
            #endif /* MAP_ANON */
hgs
parents:
diff changeset
   398
            #ifdef MAP_ANONYMOUS
hgs
parents:
diff changeset
   399
                #define MMAP_FLAGS           (MAP_PRIVATE|MAP_ANONYMOUS)
hgs
parents:
diff changeset
   400
                #define CALL_MMAP(s)         mmap(0, (s), MMAP_PROT, (int)MMAP_FLAGS, -1, 0)
hgs
parents:
diff changeset
   401
            #else /* MAP_ANONYMOUS */
hgs
parents:
diff changeset
   402
                /*
hgs
parents:
diff changeset
   403
                   Nearly all versions of mmap support MAP_ANONYMOUS, so the following
hgs
parents:
diff changeset
   404
                   is unlikely to be needed, but is supplied just in case.
hgs
parents:
diff changeset
   405
                */
hgs
parents:
diff changeset
   406
                #define MMAP_FLAGS           (MAP_PRIVATE)
hgs
parents:
diff changeset
   407
                //static int dev_zero_fd = -1; /* Cached file descriptor for /dev/zero. */
hgs
parents:
diff changeset
   408
                #define CALL_MMAP(s) DLMMAP(s)
hgs
parents:
diff changeset
   409
                /*#define CALL_MMAP(s) ((dev_zero_fd < 0) ? \
hgs
parents:
diff changeset
   410
                       (dev_zero_fd = open("/dev/zero", O_RDWR), \
hgs
parents:
diff changeset
   411
                        mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0)) : \
hgs
parents:
diff changeset
   412
                        mmap(0, (s), MMAP_PROT, MMAP_FLAGS, dev_zero_fd, 0))
hgs
parents:
diff changeset
   413
                        */
hgs
parents:
diff changeset
   414
                #define CALL_REMAP(a, s, d)    DLREMAP((a),(s),(d))
hgs
parents:
diff changeset
   415
            #endif /* MAP_ANONYMOUS */
hgs
parents:
diff changeset
   416
            #define DIRECT_MMAP(s)       CALL_MMAP(s)
hgs
parents:
diff changeset
   417
        #else /* WIN32 */
hgs
parents:
diff changeset
   418
            #define CALL_MMAP(s)         win32mmap(s)
hgs
parents:
diff changeset
   419
            #define CALL_MUNMAP(a, s)    win32munmap((a), (s))
hgs
parents:
diff changeset
   420
            #define DIRECT_MMAP(s)       win32direct_mmap(s)
hgs
parents:
diff changeset
   421
        #endif /* WIN32 */
hgs
parents:
diff changeset
   422
#endif /* HAVE_MMAP */
hgs
parents:
diff changeset
   423
hgs
parents:
diff changeset
   424
#if HAVE_MMAP && HAVE_MREMAP
hgs
parents:
diff changeset
   425
    #define CALL_MREMAP(addr, osz, nsz, mv) mremap((addr), (osz), (nsz), (mv))
hgs
parents:
diff changeset
   426
#else  /* HAVE_MMAP && HAVE_MREMAP */
hgs
parents:
diff changeset
   427
    #define CALL_MREMAP(addr, osz, nsz, mv) MFAIL
hgs
parents:
diff changeset
   428
#endif /* HAVE_MMAP && HAVE_MREMAP */
hgs
parents:
diff changeset
   429
hgs
parents:
diff changeset
   430
#if HAVE_MORECORE
hgs
parents:
diff changeset
   431
    #define CALL_MORECORE(S)     SetBrk(S)
hgs
parents:
diff changeset
   432
#else  /* HAVE_MORECORE */
hgs
parents:
diff changeset
   433
    #define CALL_MORECORE(S)     MFAIL
hgs
parents:
diff changeset
   434
#endif /* HAVE_MORECORE */
hgs
parents:
diff changeset
   435
hgs
parents:
diff changeset
   436
/* mstate bit set if continguous morecore disabled or failed */
hgs
parents:
diff changeset
   437
#define USE_NONCONTIGUOUS_BIT (4U)
hgs
parents:
diff changeset
   438
hgs
parents:
diff changeset
   439
/* segment bit set in create_mspace_with_base */
hgs
parents:
diff changeset
   440
#define EXTERN_BIT            (8U)
hgs
parents:
diff changeset
   441
hgs
parents:
diff changeset
   442
hgs
parents:
diff changeset
   443
#if USE_LOCKS
hgs
parents:
diff changeset
   444
/*
hgs
parents:
diff changeset
   445
  When locks are defined, there are up to two global locks:
hgs
parents:
diff changeset
   446
  * If HAVE_MORECORE, morecore_mutex protects sequences of calls to
hgs
parents:
diff changeset
   447
    MORECORE.  In many cases sys_alloc requires two calls, that should
hgs
parents:
diff changeset
   448
    not be interleaved with calls by other threads.  This does not
hgs
parents:
diff changeset
   449
    protect against direct calls to MORECORE by other threads not
hgs
parents:
diff changeset
   450
    using this lock, so there is still code to cope the best we can on
hgs
parents:
diff changeset
   451
    interference.
hgs
parents:
diff changeset
   452
  * magic_init_mutex ensures that mparams.magic and other
hgs
parents:
diff changeset
   453
    unique mparams values are initialized only once.
hgs
parents:
diff changeset
   454
*/
hgs
parents:
diff changeset
   455
    #ifndef WIN32
hgs
parents:
diff changeset
   456
        /* By default use posix locks */
hgs
parents:
diff changeset
   457
        #include <pthread.h>
hgs
parents:
diff changeset
   458
        #define MLOCK_T pthread_mutex_t
hgs
parents:
diff changeset
   459
        #define INITIAL_LOCK(l)      pthread_mutex_init(l, NULL)
hgs
parents:
diff changeset
   460
        #define ACQUIRE_LOCK(l)      pthread_mutex_lock(l)
hgs
parents:
diff changeset
   461
        #define RELEASE_LOCK(l)      pthread_mutex_unlock(l)
hgs
parents:
diff changeset
   462
hgs
parents:
diff changeset
   463
        #if HAVE_MORECORE
hgs
parents:
diff changeset
   464
            //static MLOCK_T morecore_mutex = PTHREAD_MUTEX_INITIALIZER;
hgs
parents:
diff changeset
   465
        #endif /* HAVE_MORECORE */
hgs
parents:
diff changeset
   466
            //static MLOCK_T magic_init_mutex = PTHREAD_MUTEX_INITIALIZER;
hgs
parents:
diff changeset
   467
    #else /* WIN32 */
hgs
parents:
diff changeset
   468
        #define MLOCK_T long
hgs
parents:
diff changeset
   469
        #define INITIAL_LOCK(l)      *(l)=0
hgs
parents:
diff changeset
   470
        #define ACQUIRE_LOCK(l)      win32_acquire_lock(l)
hgs
parents:
diff changeset
   471
        #define RELEASE_LOCK(l)      win32_release_lock(l)
hgs
parents:
diff changeset
   472
        #if HAVE_MORECORE
hgs
parents:
diff changeset
   473
            static MLOCK_T morecore_mutex;
hgs
parents:
diff changeset
   474
        #endif /* HAVE_MORECORE */
hgs
parents:
diff changeset
   475
        static MLOCK_T magic_init_mutex;
hgs
parents:
diff changeset
   476
    #endif /* WIN32 */
hgs
parents:
diff changeset
   477
    #define USE_LOCK_BIT               (2U)
hgs
parents:
diff changeset
   478
#else  /* USE_LOCKS */
hgs
parents:
diff changeset
   479
    #define USE_LOCK_BIT               (0U)
hgs
parents:
diff changeset
   480
    #define INITIAL_LOCK(l)
hgs
parents:
diff changeset
   481
#endif /* USE_LOCKS */
hgs
parents:
diff changeset
   482
hgs
parents:
diff changeset
   483
#if USE_LOCKS && HAVE_MORECORE
hgs
parents:
diff changeset
   484
    #define ACQUIRE_MORECORE_LOCK(M)    ACQUIRE_LOCK((M->morecore_mutex)/*&morecore_mutex*/);
hgs
parents:
diff changeset
   485
    #define RELEASE_MORECORE_LOCK(M)    RELEASE_LOCK((M->morecore_mutex)/*&morecore_mutex*/);
hgs
parents:
diff changeset
   486
#else /* USE_LOCKS && HAVE_MORECORE */
hgs
parents:
diff changeset
   487
    #define ACQUIRE_MORECORE_LOCK(M)
hgs
parents:
diff changeset
   488
    #define RELEASE_MORECORE_LOCK(M)
hgs
parents:
diff changeset
   489
#endif /* USE_LOCKS && HAVE_MORECORE */
hgs
parents:
diff changeset
   490
hgs
parents:
diff changeset
   491
#if USE_LOCKS
hgs
parents:
diff changeset
   492
        /*Currently not suporting this*/
hgs
parents:
diff changeset
   493
    #define ACQUIRE_MAGIC_INIT_LOCK(M)  ACQUIRE_LOCK(((M)->magic_init_mutex));
hgs
parents:
diff changeset
   494
    //AMOD: changed #define ACQUIRE_MAGIC_INIT_LOCK()
hgs
parents:
diff changeset
   495
    //#define RELEASE_MAGIC_INIT_LOCK()
hgs
parents:
diff changeset
   496
    #define RELEASE_MAGIC_INIT_LOCK(M)  RELEASE_LOCK(((M)->magic_init_mutex));
hgs
parents:
diff changeset
   497
#else  /* USE_LOCKS */
hgs
parents:
diff changeset
   498
    #define ACQUIRE_MAGIC_INIT_LOCK(M)
hgs
parents:
diff changeset
   499
    #define RELEASE_MAGIC_INIT_LOCK(M)
hgs
parents:
diff changeset
   500
#endif /* USE_LOCKS */
hgs
parents:
diff changeset
   501
hgs
parents:
diff changeset
   502
/*CHUNK representation*/
hgs
parents:
diff changeset
   503
struct malloc_chunk {
hgs
parents:
diff changeset
   504
  size_t               prev_foot;  /* Size of previous chunk (if free).  */
hgs
parents:
diff changeset
   505
  size_t               head;       /* Size and inuse bits. */
hgs
parents:
diff changeset
   506
  struct malloc_chunk* fd;         /* double links -- used only if free. */
hgs
parents:
diff changeset
   507
  struct malloc_chunk* bk;
hgs
parents:
diff changeset
   508
};
hgs
parents:
diff changeset
   509
hgs
parents:
diff changeset
   510
typedef struct malloc_chunk  mchunk;
hgs
parents:
diff changeset
   511
typedef struct malloc_chunk* mchunkptr;
hgs
parents:
diff changeset
   512
typedef struct malloc_chunk* sbinptr;  /* The type of bins of chunks */
hgs
parents:
diff changeset
   513
typedef unsigned int bindex_t;         /* Described below */
hgs
parents:
diff changeset
   514
typedef unsigned int binmap_t;         /* Described below */
hgs
parents:
diff changeset
   515
typedef unsigned int flag_t;           /* The type of various bit flag sets */
hgs
parents:
diff changeset
   516
hgs
parents:
diff changeset
   517
hgs
parents:
diff changeset
   518
/* ------------------- Chunks sizes and alignments ----------------------- */
hgs
parents:
diff changeset
   519
#define MCHUNK_SIZE         (sizeof(mchunk))
hgs
parents:
diff changeset
   520
hgs
parents:
diff changeset
   521
#if FOOTERS
hgs
parents:
diff changeset
   522
    #define CHUNK_OVERHEAD      (TWO_SIZE_T_SIZES)
hgs
parents:
diff changeset
   523
#else /* FOOTERS */
hgs
parents:
diff changeset
   524
    #define CHUNK_OVERHEAD      (SIZE_T_SIZE)
hgs
parents:
diff changeset
   525
#endif /* FOOTERS */
hgs
parents:
diff changeset
   526
hgs
parents:
diff changeset
   527
/* MMapped chunks need a second word of overhead ... */
hgs
parents:
diff changeset
   528
#define MMAP_CHUNK_OVERHEAD (TWO_SIZE_T_SIZES)
hgs
parents:
diff changeset
   529
/* ... and additional padding for fake next-chunk at foot */
hgs
parents:
diff changeset
   530
#define MMAP_FOOT_PAD       (FOUR_SIZE_T_SIZES)
hgs
parents:
diff changeset
   531
hgs
parents:
diff changeset
   532
/* The smallest size we can malloc is an aligned minimal chunk */
hgs
parents:
diff changeset
   533
#define MIN_CHUNK_SIZE ((MCHUNK_SIZE + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
hgs
parents:
diff changeset
   534
hgs
parents:
diff changeset
   535
/* conversion from malloc headers to user pointers, and back */
hgs
parents:
diff changeset
   536
#define chunk2mem(p)        ((void*)((TUint8*)(p)       + TWO_SIZE_T_SIZES))
hgs
parents:
diff changeset
   537
#define mem2chunk(mem)      ((mchunkptr)((TUint8*)(mem) - TWO_SIZE_T_SIZES))
hgs
parents:
diff changeset
   538
/* chunk associated with aligned address A */
hgs
parents:
diff changeset
   539
#define align_as_chunk(A)   (mchunkptr)((A) + align_offset(chunk2mem(A)))
hgs
parents:
diff changeset
   540
hgs
parents:
diff changeset
   541
/* Bounds on request (not chunk) sizes. */
hgs
parents:
diff changeset
   542
#define MAX_REQUEST         ((-MIN_CHUNK_SIZE) << 2)
hgs
parents:
diff changeset
   543
#define MIN_REQUEST         (MIN_CHUNK_SIZE - CHUNK_OVERHEAD - SIZE_T_ONE)
hgs
parents:
diff changeset
   544
hgs
parents:
diff changeset
   545
/* pad request bytes into a usable size */
hgs
parents:
diff changeset
   546
#define pad_request(req) (((req) + CHUNK_OVERHEAD + CHUNK_ALIGN_MASK) & ~CHUNK_ALIGN_MASK)
hgs
parents:
diff changeset
   547
hgs
parents:
diff changeset
   548
/* pad request, checking for minimum (but not maximum) */
hgs
parents:
diff changeset
   549
#define request2size(req) (((req) < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(req))
hgs
parents:
diff changeset
   550
hgs
parents:
diff changeset
   551
/* ------------------ Operations on head and foot fields ----------------- */
hgs
parents:
diff changeset
   552
hgs
parents:
diff changeset
   553
/*
hgs
parents:
diff changeset
   554
  The head field of a chunk is or'ed with PINUSE_BIT when previous
hgs
parents:
diff changeset
   555
  adjacent chunk in use, and or'ed with CINUSE_BIT if this chunk is in
hgs
parents:
diff changeset
   556
  use. If the chunk was obtained with mmap, the prev_foot field has
hgs
parents:
diff changeset
   557
  IS_MMAPPED_BIT set, otherwise holding the offset of the base of the
hgs
parents:
diff changeset
   558
  mmapped region to the base of the chunk.
hgs
parents:
diff changeset
   559
*/
hgs
parents:
diff changeset
   560
#define PINUSE_BIT          (SIZE_T_ONE)
hgs
parents:
diff changeset
   561
#define CINUSE_BIT          (SIZE_T_TWO)
hgs
parents:
diff changeset
   562
#define INUSE_BITS          (PINUSE_BIT|CINUSE_BIT)
hgs
parents:
diff changeset
   563
hgs
parents:
diff changeset
   564
/* Head value for fenceposts */
hgs
parents:
diff changeset
   565
#define FENCEPOST_HEAD      (INUSE_BITS|SIZE_T_SIZE)
hgs
parents:
diff changeset
   566
hgs
parents:
diff changeset
   567
/* extraction of fields from head words */
hgs
parents:
diff changeset
   568
#define cinuse(p)           ((p)->head & CINUSE_BIT)
hgs
parents:
diff changeset
   569
#define pinuse(p)           ((p)->head & PINUSE_BIT)
hgs
parents:
diff changeset
   570
#define chunksize(p)        ((p)->head & ~(INUSE_BITS))
hgs
parents:
diff changeset
   571
hgs
parents:
diff changeset
   572
#define clear_pinuse(p)     ((p)->head &= ~PINUSE_BIT)
hgs
parents:
diff changeset
   573
#define clear_cinuse(p)     ((p)->head &= ~CINUSE_BIT)
hgs
parents:
diff changeset
   574
hgs
parents:
diff changeset
   575
/* Treat space at ptr +/- offset as a chunk */
hgs
parents:
diff changeset
   576
#define chunk_plus_offset(p, s)  ((mchunkptr)(((TUint8*)(p)) + (s)))
hgs
parents:
diff changeset
   577
#define chunk_minus_offset(p, s) ((mchunkptr)(((TUint8*)(p)) - (s)))
hgs
parents:
diff changeset
   578
hgs
parents:
diff changeset
   579
/* Ptr to next or previous physical malloc_chunk. */
hgs
parents:
diff changeset
   580
#define next_chunk(p) ((mchunkptr)( ((TUint8*)(p)) + ((p)->head & ~INUSE_BITS)))
hgs
parents:
diff changeset
   581
#define prev_chunk(p) ((mchunkptr)( ((TUint8*)(p)) - ((p)->prev_foot) ))
hgs
parents:
diff changeset
   582
hgs
parents:
diff changeset
   583
/* extract next chunk's pinuse bit */
hgs
parents:
diff changeset
   584
#define next_pinuse(p)  ((next_chunk(p)->head) & PINUSE_BIT)
hgs
parents:
diff changeset
   585
hgs
parents:
diff changeset
   586
/* Get/set size at footer */
hgs
parents:
diff changeset
   587
#define get_foot(p, s)  (((mchunkptr)((TUint8*)(p) + (s)))->prev_foot)
hgs
parents:
diff changeset
   588
#define set_foot(p, s)  (((mchunkptr)((TUint8*)(p) + (s)))->prev_foot = (s))
hgs
parents:
diff changeset
   589
hgs
parents:
diff changeset
   590
/* Set size, pinuse bit, and foot */
hgs
parents:
diff changeset
   591
#define set_size_and_pinuse_of_free_chunk(p, s) ((p)->head = (s|PINUSE_BIT), set_foot(p, s))
hgs
parents:
diff changeset
   592
hgs
parents:
diff changeset
   593
/* Set size, pinuse bit, foot, and clear next pinuse */
hgs
parents:
diff changeset
   594
#define set_free_with_pinuse(p, s, n) (clear_pinuse(n), set_size_and_pinuse_of_free_chunk(p, s))
hgs
parents:
diff changeset
   595
hgs
parents:
diff changeset
   596
#define is_mmapped(p) (!((p)->head & PINUSE_BIT) && ((p)->prev_foot & IS_MMAPPED_BIT))
hgs
parents:
diff changeset
   597
hgs
parents:
diff changeset
   598
/* Get the internal overhead associated with chunk p */
hgs
parents:
diff changeset
   599
#define overhead_for(p) (is_mmapped(p)? MMAP_CHUNK_OVERHEAD : CHUNK_OVERHEAD)
hgs
parents:
diff changeset
   600
hgs
parents:
diff changeset
   601
/* Return true if malloced space is not necessarily cleared */
hgs
parents:
diff changeset
   602
#if MMAP_CLEARS
hgs
parents:
diff changeset
   603
    #define calloc_must_clear(p) (!is_mmapped(p))
hgs
parents:
diff changeset
   604
#else /* MMAP_CLEARS */
hgs
parents:
diff changeset
   605
    #define calloc_must_clear(p) (1)
hgs
parents:
diff changeset
   606
#endif /* MMAP_CLEARS */
hgs
parents:
diff changeset
   607
hgs
parents:
diff changeset
   608
/* ---------------------- Overlaid data structures ----------------------- */
hgs
parents:
diff changeset
   609
struct malloc_tree_chunk {
hgs
parents:
diff changeset
   610
  /* The first four fields must be compatible with malloc_chunk */
hgs
parents:
diff changeset
   611
  size_t                                    prev_foot;
hgs
parents:
diff changeset
   612
  size_t                                    head;
hgs
parents:
diff changeset
   613
  struct malloc_tree_chunk* fd;
hgs
parents:
diff changeset
   614
  struct malloc_tree_chunk* bk;
hgs
parents:
diff changeset
   615
hgs
parents:
diff changeset
   616
  struct malloc_tree_chunk* child[2];
hgs
parents:
diff changeset
   617
  struct malloc_tree_chunk* parent;
hgs
parents:
diff changeset
   618
  bindex_t                  index;
hgs
parents:
diff changeset
   619
  size_t            pageout;  /* chunk pageout flag  */
hgs
parents:
diff changeset
   620
  size_t            npages;   /* chunk pageout size */
hgs
parents:
diff changeset
   621
};
hgs
parents:
diff changeset
   622
hgs
parents:
diff changeset
   623
typedef struct malloc_tree_chunk  tchunk;
hgs
parents:
diff changeset
   624
typedef struct malloc_tree_chunk* tchunkptr;
hgs
parents:
diff changeset
   625
typedef struct malloc_tree_chunk* tbinptr; /* The type of bins of trees */
hgs
parents:
diff changeset
   626
hgs
parents:
diff changeset
   627
/* A little helper macro for trees */
hgs
parents:
diff changeset
   628
#define leftmost_child(t) ((t)->child[0] != 0? (t)->child[0] : (t)->child[1])
hgs
parents:
diff changeset
   629
/*Segment structur*/
hgs
parents:
diff changeset
   630
struct malloc_segment {
hgs
parents:
diff changeset
   631
  TUint8*        base;             /* base address */
hgs
parents:
diff changeset
   632
  size_t       size;             /* allocated size */
hgs
parents:
diff changeset
   633
  struct malloc_segment* next;   /* ptr to next segment */
hgs
parents:
diff changeset
   634
  flag_t       sflags;           /* mmap and extern flag */
hgs
parents:
diff changeset
   635
};
hgs
parents:
diff changeset
   636
hgs
parents:
diff changeset
   637
#define is_mmapped_segment(S)  ((S)->sflags & IS_MMAPPED_BIT)
hgs
parents:
diff changeset
   638
#define is_extern_segment(S)   ((S)->sflags & EXTERN_BIT)
hgs
parents:
diff changeset
   639
hgs
parents:
diff changeset
   640
typedef struct malloc_segment  msegment;
hgs
parents:
diff changeset
   641
typedef struct malloc_segment* msegmentptr;
hgs
parents:
diff changeset
   642
hgs
parents:
diff changeset
   643
/*Malloc State data structur*/
hgs
parents:
diff changeset
   644
hgs
parents:
diff changeset
   645
#define NSMALLBINS        (32U)
hgs
parents:
diff changeset
   646
#define NTREEBINS         (32U)
hgs
parents:
diff changeset
   647
#define SMALLBIN_SHIFT    (3U)
hgs
parents:
diff changeset
   648
#define SMALLBIN_WIDTH    (SIZE_T_ONE << SMALLBIN_SHIFT)
hgs
parents:
diff changeset
   649
#define TREEBIN_SHIFT     (8U)
hgs
parents:
diff changeset
   650
#define MIN_LARGE_SIZE    (SIZE_T_ONE << TREEBIN_SHIFT)
hgs
parents:
diff changeset
   651
#define MAX_SMALL_SIZE    (MIN_LARGE_SIZE - SIZE_T_ONE)
hgs
parents:
diff changeset
   652
#define MAX_SMALL_REQUEST (MAX_SMALL_SIZE - CHUNK_ALIGN_MASK - CHUNK_OVERHEAD)
hgs
parents:
diff changeset
   653
hgs
parents:
diff changeset
   654
struct malloc_state {
hgs
parents:
diff changeset
   655
  binmap_t   smallmap;
hgs
parents:
diff changeset
   656
  binmap_t   treemap;
hgs
parents:
diff changeset
   657
  size_t     dvsize; // unused
hgs
parents:
diff changeset
   658
  size_t     topsize;
hgs
parents:
diff changeset
   659
  TUint8*      least_addr;
hgs
parents:
diff changeset
   660
  mchunkptr  dv; // unused
hgs
parents:
diff changeset
   661
  mchunkptr  top;
hgs
parents:
diff changeset
   662
  size_t     trim_check;
hgs
parents:
diff changeset
   663
  size_t     magic;
hgs
parents:
diff changeset
   664
  mchunkptr  smallbins[(NSMALLBINS+1)*2];
hgs
parents:
diff changeset
   665
  tbinptr    treebins[NTREEBINS];
hgs
parents:
diff changeset
   666
  size_t     footprint;
hgs
parents:
diff changeset
   667
  size_t     max_footprint;
hgs
parents:
diff changeset
   668
  flag_t     mflags;
hgs
parents:
diff changeset
   669
#if USE_LOCKS
hgs
parents:
diff changeset
   670
  MLOCK_T    mutex;     /* locate lock among fields that rarely change */
hgs
parents:
diff changeset
   671
  MLOCK_T   magic_init_mutex;
hgs
parents:
diff changeset
   672
  MLOCK_T   morecore_mutex;
hgs
parents:
diff changeset
   673
#endif /* USE_LOCKS */
hgs
parents:
diff changeset
   674
  msegment   seg;
hgs
parents:
diff changeset
   675
};
hgs
parents:
diff changeset
   676
hgs
parents:
diff changeset
   677
typedef struct malloc_state*    mstate;
hgs
parents:
diff changeset
   678
hgs
parents:
diff changeset
   679
/* ------------- Global malloc_state and malloc_params ------------------- */
hgs
parents:
diff changeset
   680
hgs
parents:
diff changeset
   681
/*
hgs
parents:
diff changeset
   682
  malloc_params holds global properties, including those that can be
hgs
parents:
diff changeset
   683
  dynamically set using mallopt. There is a single instance, mparams,
hgs
parents:
diff changeset
   684
  initialized in init_mparams.
hgs
parents:
diff changeset
   685
*/
hgs
parents:
diff changeset
   686
hgs
parents:
diff changeset
   687
struct malloc_params {
hgs
parents:
diff changeset
   688
  size_t magic;
hgs
parents:
diff changeset
   689
  size_t page_size;
hgs
parents:
diff changeset
   690
  size_t granularity;
hgs
parents:
diff changeset
   691
  size_t mmap_threshold;
hgs
parents:
diff changeset
   692
  size_t trim_threshold;
hgs
parents:
diff changeset
   693
  flag_t default_mflags;
hgs
parents:
diff changeset
   694
#if USE_LOCKS
hgs
parents:
diff changeset
   695
  MLOCK_T   magic_init_mutex;
hgs
parents:
diff changeset
   696
#endif /* USE_LOCKS */
hgs
parents:
diff changeset
   697
};
hgs
parents:
diff changeset
   698
hgs
parents:
diff changeset
   699
/* The global malloc_state used for all non-"mspace" calls */
hgs
parents:
diff changeset
   700
/*AMOD: Need to check this as this will be the member of the class*/
hgs
parents:
diff changeset
   701
hgs
parents:
diff changeset
   702
//static struct malloc_state _gm_;
hgs
parents:
diff changeset
   703
//#define gm                 (&_gm_)
hgs
parents:
diff changeset
   704
hgs
parents:
diff changeset
   705
//#define is_global(M)       ((M) == &_gm_)
hgs
parents:
diff changeset
   706
/*AMOD: has changed*/
hgs
parents:
diff changeset
   707
#define is_global(M)       ((M) == gm)
hgs
parents:
diff changeset
   708
#define is_initialized(M)  ((M)->top != 0)
hgs
parents:
diff changeset
   709
hgs
parents:
diff changeset
   710
/* -------------------------- system alloc setup ------------------------- */
hgs
parents:
diff changeset
   711
hgs
parents:
diff changeset
   712
/* Operations on mflags */
hgs
parents:
diff changeset
   713
hgs
parents:
diff changeset
   714
#define use_lock(M)           ((M)->mflags &   USE_LOCK_BIT)
hgs
parents:
diff changeset
   715
#define enable_lock(M)        ((M)->mflags |=  USE_LOCK_BIT)
hgs
parents:
diff changeset
   716
#define disable_lock(M)       ((M)->mflags &= ~USE_LOCK_BIT)
hgs
parents:
diff changeset
   717
hgs
parents:
diff changeset
   718
#define use_mmap(M)           ((M)->mflags &   USE_MMAP_BIT)
hgs
parents:
diff changeset
   719
#define enable_mmap(M)        ((M)->mflags |=  USE_MMAP_BIT)
hgs
parents:
diff changeset
   720
#define disable_mmap(M)       ((M)->mflags &= ~USE_MMAP_BIT)
hgs
parents:
diff changeset
   721
hgs
parents:
diff changeset
   722
#define use_noncontiguous(M)  ((M)->mflags &   USE_NONCONTIGUOUS_BIT)
hgs
parents:
diff changeset
   723
#define disable_contiguous(M) ((M)->mflags |=  USE_NONCONTIGUOUS_BIT)
hgs
parents:
diff changeset
   724
hgs
parents:
diff changeset
   725
#define set_lock(M,L) ((M)->mflags = (L)? ((M)->mflags | USE_LOCK_BIT) :  ((M)->mflags & ~USE_LOCK_BIT))
hgs
parents:
diff changeset
   726
hgs
parents:
diff changeset
   727
/* page-align a size */
hgs
parents:
diff changeset
   728
#define page_align(S) (((S) + (mparams.page_size)) & ~(mparams.page_size - SIZE_T_ONE))
hgs
parents:
diff changeset
   729
hgs
parents:
diff changeset
   730
/* granularity-align a size */
hgs
parents:
diff changeset
   731
#define granularity_align(S)  (((S) + (mparams.granularity)) & ~(mparams.granularity - SIZE_T_ONE))
hgs
parents:
diff changeset
   732
hgs
parents:
diff changeset
   733
#define is_page_aligned(S)   (((size_t)(S) & (mparams.page_size - SIZE_T_ONE)) == 0)
hgs
parents:
diff changeset
   734
#define is_granularity_aligned(S)   (((size_t)(S) & (mparams.granularity - SIZE_T_ONE)) == 0)
hgs
parents:
diff changeset
   735
hgs
parents:
diff changeset
   736
/*  True if segment S holds address A */
hgs
parents:
diff changeset
   737
#define segment_holds(S, A)  ((TUint8*)(A) >= S->base && (TUint8*)(A) < S->base + S->size)
hgs
parents:
diff changeset
   738
hgs
parents:
diff changeset
   739
#ifndef MORECORE_CANNOT_TRIM
hgs
parents:
diff changeset
   740
    #define should_trim(M,s)  ((s) > (M)->trim_check)
hgs
parents:
diff changeset
   741
#else  /* MORECORE_CANNOT_TRIM */
hgs
parents:
diff changeset
   742
    #define should_trim(M,s)  (0)
hgs
parents:
diff changeset
   743
#endif /* MORECORE_CANNOT_TRIM */
hgs
parents:
diff changeset
   744
hgs
parents:
diff changeset
   745
/*
hgs
parents:
diff changeset
   746
  TOP_FOOT_SIZE is padding at the end of a segment, including space
hgs
parents:
diff changeset
   747
  that may be needed to place segment records and fenceposts when new
hgs
parents:
diff changeset
   748
  noncontiguous segments are added.
hgs
parents:
diff changeset
   749
*/
hgs
parents:
diff changeset
   750
#define TOP_FOOT_SIZE  (align_offset(chunk2mem(0))+pad_request(sizeof(struct malloc_segment))+MIN_CHUNK_SIZE)
hgs
parents:
diff changeset
   751
hgs
parents:
diff changeset
   752
/* -------------------------------  Hooks -------------------------------- */
hgs
parents:
diff changeset
   753
hgs
parents:
diff changeset
   754
/*
hgs
parents:
diff changeset
   755
  PREACTION should be defined to return 0 on success, and nonzero on
hgs
parents:
diff changeset
   756
  failure. If you are not using locking, you can redefine these to do
hgs
parents:
diff changeset
   757
  anything you like.
hgs
parents:
diff changeset
   758
*/
hgs
parents:
diff changeset
   759
hgs
parents:
diff changeset
   760
#if USE_LOCKS
hgs
parents:
diff changeset
   761
    /* Ensure locks are initialized */
hgs
parents:
diff changeset
   762
    #define GLOBALLY_INITIALIZE() (mparams.page_size == 0 && init_mparams())
hgs
parents:
diff changeset
   763
    #define PREACTION(M) (use_lock((M))?(ACQUIRE_LOCK((M)->mutex),0):0) /*Action to take like lock before alloc*/
hgs
parents:
diff changeset
   764
    #define POSTACTION(M) { if (use_lock(M)) RELEASE_LOCK((M)->mutex); }
hgs
parents:
diff changeset
   765
hgs
parents:
diff changeset
   766
#else /* USE_LOCKS */
hgs
parents:
diff changeset
   767
    #ifndef PREACTION
hgs
parents:
diff changeset
   768
        #define PREACTION(M) (0)
hgs
parents:
diff changeset
   769
    #endif  /* PREACTION */
hgs
parents:
diff changeset
   770
    #ifndef POSTACTION
hgs
parents:
diff changeset
   771
        #define POSTACTION(M)
hgs
parents:
diff changeset
   772
    #endif  /* POSTACTION */
hgs
parents:
diff changeset
   773
#endif /* USE_LOCKS */
hgs
parents:
diff changeset
   774
hgs
parents:
diff changeset
   775
/*
hgs
parents:
diff changeset
   776
  CORRUPTION_ERROR_ACTION is triggered upon detected bad addresses.
hgs
parents:
diff changeset
   777
  USAGE_ERROR_ACTION is triggered on detected bad frees and
hgs
parents:
diff changeset
   778
  reallocs. The argument p is an address that might have triggered the
hgs
parents:
diff changeset
   779
  fault. It is ignored by the two predefined actions, but might be
hgs
parents:
diff changeset
   780
  useful in custom actions that try to help diagnose errors.
hgs
parents:
diff changeset
   781
*/
hgs
parents:
diff changeset
   782
hgs
parents:
diff changeset
   783
#if PROCEED_ON_ERROR
hgs
parents:
diff changeset
   784
    /* A count of the number of corruption errors causing resets */
hgs
parents:
diff changeset
   785
    int malloc_corruption_error_count;
hgs
parents:
diff changeset
   786
    /* default corruption action */
hgs
parents:
diff changeset
   787
    static void reset_on_error(mstate m);
hgs
parents:
diff changeset
   788
    #define CORRUPTION_ERROR_ACTION(m)  reset_on_error(m)
hgs
parents:
diff changeset
   789
    #define USAGE_ERROR_ACTION(m, p)
hgs
parents:
diff changeset
   790
#else /* PROCEED_ON_ERROR */
hgs
parents:
diff changeset
   791
    #ifndef CORRUPTION_ERROR_ACTION
hgs
parents:
diff changeset
   792
        #define CORRUPTION_ERROR_ACTION(m) ABORT
hgs
parents:
diff changeset
   793
    #endif /* CORRUPTION_ERROR_ACTION */
hgs
parents:
diff changeset
   794
    #ifndef USAGE_ERROR_ACTION
hgs
parents:
diff changeset
   795
        #define USAGE_ERROR_ACTION(m,p) ABORT
hgs
parents:
diff changeset
   796
    #endif /* USAGE_ERROR_ACTION */
hgs
parents:
diff changeset
   797
#endif /* PROCEED_ON_ERROR */
hgs
parents:
diff changeset
   798
hgs
parents:
diff changeset
   799
    /* -------------------------- Debugging setup ---------------------------- */
hgs
parents:
diff changeset
   800
hgs
parents:
diff changeset
   801
#if ! DEBUG
hgs
parents:
diff changeset
   802
    #define check_free_chunk(M,P)
hgs
parents:
diff changeset
   803
    #define check_inuse_chunk(M,P)
hgs
parents:
diff changeset
   804
    #define check_malloced_chunk(M,P,N)
hgs
parents:
diff changeset
   805
    #define check_mmapped_chunk(M,P)
hgs
parents:
diff changeset
   806
    #define check_malloc_state(M)
hgs
parents:
diff changeset
   807
    #define check_top_chunk(M,P)
hgs
parents:
diff changeset
   808
#else /* DEBUG */
hgs
parents:
diff changeset
   809
    #define check_free_chunk(M,P)       do_check_free_chunk(M,P)
hgs
parents:
diff changeset
   810
    #define check_inuse_chunk(M,P)      do_check_inuse_chunk(M,P)
hgs
parents:
diff changeset
   811
    #define check_top_chunk(M,P)        do_check_top_chunk(M,P)
hgs
parents:
diff changeset
   812
    #define check_malloced_chunk(M,P,N) do_check_malloced_chunk(M,P,N)
hgs
parents:
diff changeset
   813
    #define check_mmapped_chunk(M,P)    do_check_mmapped_chunk(M,P)
hgs
parents:
diff changeset
   814
    #define check_malloc_state(M)       do_check_malloc_state(M)
hgs
parents:
diff changeset
   815
    static void   do_check_any_chunk(mstate m, mchunkptr p);
hgs
parents:
diff changeset
   816
    static void   do_check_top_chunk(mstate m, mchunkptr p);
hgs
parents:
diff changeset
   817
    static void   do_check_mmapped_chunk(mstate m, mchunkptr p);
hgs
parents:
diff changeset
   818
    static void   do_check_inuse_chunk(mstate m, mchunkptr p);
hgs
parents:
diff changeset
   819
    static void   do_check_free_chunk(mstate m, mchunkptr p);
hgs
parents:
diff changeset
   820
    static void   do_check_malloced_chunk(mstate m, void* mem, size_t s);
hgs
parents:
diff changeset
   821
    static void   do_check_tree(mstate m, tchunkptr t);
hgs
parents:
diff changeset
   822
    static void   do_check_treebin(mstate m, bindex_t i);
hgs
parents:
diff changeset
   823
    static void   do_check_smallbin(mstate m, bindex_t i);
hgs
parents:
diff changeset
   824
    static void   do_check_malloc_state(mstate m);
hgs
parents:
diff changeset
   825
    static int    bin_find(mstate m, mchunkptr x);
hgs
parents:
diff changeset
   826
    static size_t traverse_and_check(mstate m);
hgs
parents:
diff changeset
   827
#endif /* DEBUG */
hgs
parents:
diff changeset
   828
hgs
parents:
diff changeset
   829
/* ---------------------------- Indexing Bins ---------------------------- */
hgs
parents:
diff changeset
   830
hgs
parents:
diff changeset
   831
#define is_small(s)         (((s) >> SMALLBIN_SHIFT) < NSMALLBINS)
hgs
parents:
diff changeset
   832
#define small_index(s)      ((s)  >> SMALLBIN_SHIFT)
hgs
parents:
diff changeset
   833
#define small_index2size(i) ((i)  << SMALLBIN_SHIFT)
hgs
parents:
diff changeset
   834
#define MIN_SMALL_INDEX     (small_index(MIN_CHUNK_SIZE))
hgs
parents:
diff changeset
   835
hgs
parents:
diff changeset
   836
/* addressing by index. See above about smallbin repositioning */
hgs
parents:
diff changeset
   837
#define smallbin_at(M, i)   ((sbinptr)((TUint8*)&((M)->smallbins[(i)<<1])))
hgs
parents:
diff changeset
   838
#define treebin_at(M,i)     (&((M)->treebins[i]))
hgs
parents:
diff changeset
   839
hgs
parents:
diff changeset
   840
hgs
parents:
diff changeset
   841
/* Bit representing maximum resolved size in a treebin at i */
hgs
parents:
diff changeset
   842
#define bit_for_tree_index(i) (i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)
hgs
parents:
diff changeset
   843
hgs
parents:
diff changeset
   844
/* Shift placing maximum resolved bit in a treebin at i as sign bit */
hgs
parents:
diff changeset
   845
#define leftshift_for_tree_index(i) ((i == NTREEBINS-1)? 0 : ((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))
hgs
parents:
diff changeset
   846
hgs
parents:
diff changeset
   847
/* The size of the smallest chunk held in bin with index i */
hgs
parents:
diff changeset
   848
#define minsize_for_tree_index(i) ((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) |  (((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))
hgs
parents:
diff changeset
   849
hgs
parents:
diff changeset
   850
hgs
parents:
diff changeset
   851
/* ------------------------ Operations on bin maps ----------------------- */
hgs
parents:
diff changeset
   852
/* bit corresponding to given index */
hgs
parents:
diff changeset
   853
#define idx2bit(i)              ((binmap_t)(1) << (i))
hgs
parents:
diff changeset
   854
/* Mark/Clear bits with given index */
hgs
parents:
diff changeset
   855
#define mark_smallmap(M,i)      ((M)->smallmap |=  idx2bit(i))
hgs
parents:
diff changeset
   856
#define clear_smallmap(M,i)     ((M)->smallmap &= ~idx2bit(i))
hgs
parents:
diff changeset
   857
#define smallmap_is_marked(M,i) ((M)->smallmap &   idx2bit(i))
hgs
parents:
diff changeset
   858
#define mark_treemap(M,i)       ((M)->treemap  |=  idx2bit(i))
hgs
parents:
diff changeset
   859
#define clear_treemap(M,i)      ((M)->treemap  &= ~idx2bit(i))
hgs
parents:
diff changeset
   860
#define treemap_is_marked(M,i)  ((M)->treemap  &   idx2bit(i))
hgs
parents:
diff changeset
   861
hgs
parents:
diff changeset
   862
/* isolate the least set bit of a bitmap */
hgs
parents:
diff changeset
   863
#define least_bit(x)         ((x) & -(x))
hgs
parents:
diff changeset
   864
hgs
parents:
diff changeset
   865
/* mask with all bits to left of least bit of x on */
hgs
parents:
diff changeset
   866
#define left_bits(x)         ((x<<1) | -(x<<1))
hgs
parents:
diff changeset
   867
hgs
parents:
diff changeset
   868
/* mask with all bits to left of or equal to least bit of x on */
hgs
parents:
diff changeset
   869
#define same_or_left_bits(x) ((x) | -(x))
hgs
parents:
diff changeset
   870
hgs
parents:
diff changeset
   871
    /* isolate the least set bit of a bitmap */
hgs
parents:
diff changeset
   872
#define least_bit(x)         ((x) & -(x))
hgs
parents:
diff changeset
   873
hgs
parents:
diff changeset
   874
/* mask with all bits to left of least bit of x on */
hgs
parents:
diff changeset
   875
#define left_bits(x)         ((x<<1) | -(x<<1))
hgs
parents:
diff changeset
   876
hgs
parents:
diff changeset
   877
/* mask with all bits to left of or equal to least bit of x on */
hgs
parents:
diff changeset
   878
#define same_or_left_bits(x) ((x) | -(x))
hgs
parents:
diff changeset
   879
hgs
parents:
diff changeset
   880
#if !INSECURE
hgs
parents:
diff changeset
   881
    /* Check if address a is at least as high as any from MORECORE or MMAP */
hgs
parents:
diff changeset
   882
    #define ok_address(M, a) ((TUint8*)(a) >= (M)->least_addr)
hgs
parents:
diff changeset
   883
    /* Check if address of next chunk n is higher than base chunk p */
hgs
parents:
diff changeset
   884
    #define ok_next(p, n)    ((TUint8*)(p) < (TUint8*)(n))
hgs
parents:
diff changeset
   885
    /* Check if p has its cinuse bit on */
hgs
parents:
diff changeset
   886
    #define ok_cinuse(p)     cinuse(p)
hgs
parents:
diff changeset
   887
    /* Check if p has its pinuse bit on */
hgs
parents:
diff changeset
   888
    #define ok_pinuse(p)     pinuse(p)
hgs
parents:
diff changeset
   889
#else /* !INSECURE */
hgs
parents:
diff changeset
   890
    #define ok_address(M, a) (1)
hgs
parents:
diff changeset
   891
    #define ok_next(b, n)    (1)
hgs
parents:
diff changeset
   892
    #define ok_cinuse(p)     (1)
hgs
parents:
diff changeset
   893
    #define ok_pinuse(p)     (1)
hgs
parents:
diff changeset
   894
#endif /* !INSECURE */
hgs
parents:
diff changeset
   895
hgs
parents:
diff changeset
   896
#if (FOOTERS && !INSECURE)
hgs
parents:
diff changeset
   897
    /* Check if (alleged) mstate m has expected magic field */
hgs
parents:
diff changeset
   898
    #define ok_magic(M)      ((M)->magic == mparams.magic)
hgs
parents:
diff changeset
   899
#else  /* (FOOTERS && !INSECURE) */
hgs
parents:
diff changeset
   900
    #define ok_magic(M)      (1)
hgs
parents:
diff changeset
   901
#endif /* (FOOTERS && !INSECURE) */
hgs
parents:
diff changeset
   902
hgs
parents:
diff changeset
   903
/* In gcc, use __builtin_expect to minimize impact of checks */
hgs
parents:
diff changeset
   904
#if !INSECURE
hgs
parents:
diff changeset
   905
    #if defined(__GNUC__) && __GNUC__ >= 3
hgs
parents:
diff changeset
   906
        #define RTCHECK(e)  __builtin_expect(e, 1)
hgs
parents:
diff changeset
   907
    #else /* GNUC */
hgs
parents:
diff changeset
   908
        #define RTCHECK(e)  (e)
hgs
parents:
diff changeset
   909
    #endif /* GNUC */
hgs
parents:
diff changeset
   910
hgs
parents:
diff changeset
   911
#else /* !INSECURE */
hgs
parents:
diff changeset
   912
    #define RTCHECK(e)  (1)
hgs
parents:
diff changeset
   913
#endif /* !INSECURE */
hgs
parents:
diff changeset
   914
/* macros to set up inuse chunks with or without footers */
hgs
parents:
diff changeset
   915
#if !FOOTERS
hgs
parents:
diff changeset
   916
    #define mark_inuse_foot(M,p,s)
hgs
parents:
diff changeset
   917
    /* Set cinuse bit and pinuse bit of next chunk */
hgs
parents:
diff changeset
   918
    #define set_inuse(M,p,s)  ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),((mchunkptr)(((TUint8*)(p)) + (s)))->head |= PINUSE_BIT)
hgs
parents:
diff changeset
   919
    /* Set cinuse and pinuse of this chunk and pinuse of next chunk */
hgs
parents:
diff changeset
   920
    #define set_inuse_and_pinuse(M,p,s) ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),((mchunkptr)(((TUint8*)(p)) + (s)))->head |= PINUSE_BIT)
hgs
parents:
diff changeset
   921
    /* Set size, cinuse and pinuse bit of this chunk */
hgs
parents:
diff changeset
   922
    #define set_size_and_pinuse_of_inuse_chunk(M, p, s) ((p)->head = (s|PINUSE_BIT|CINUSE_BIT))
hgs
parents:
diff changeset
   923
#else /* FOOTERS */
hgs
parents:
diff changeset
   924
    /* Set foot of inuse chunk to be xor of mstate and seed */
hgs
parents:
diff changeset
   925
    #define mark_inuse_foot(M,p,s) (((mchunkptr)((TUint8*)(p) + (s)))->prev_foot = ((size_t)(M) ^ mparams.magic))
hgs
parents:
diff changeset
   926
    #define get_mstate_for(p) ((mstate)(((mchunkptr)((TUint8*)(p)+(chunksize(p))))->prev_foot ^ mparams.magic))
hgs
parents:
diff changeset
   927
    #define set_inuse(M,p,s)\
hgs
parents:
diff changeset
   928
        ((p)->head = (((p)->head & PINUSE_BIT)|s|CINUSE_BIT),\
hgs
parents:
diff changeset
   929
        (((mchunkptr)(((TUint8*)(p)) + (s)))->head |= PINUSE_BIT), \
hgs
parents:
diff changeset
   930
        mark_inuse_foot(M,p,s))
hgs
parents:
diff changeset
   931
    #define set_inuse_and_pinuse(M,p,s)\
hgs
parents:
diff changeset
   932
    ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
hgs
parents:
diff changeset
   933
    (((mchunkptr)(((TUint8*)(p)) + (s)))->head |= PINUSE_BIT),\
hgs
parents:
diff changeset
   934
    mark_inuse_foot(M,p,s))
hgs
parents:
diff changeset
   935
    #define set_size_and_pinuse_of_inuse_chunk(M, p, s)\
hgs
parents:
diff changeset
   936
    ((p)->head = (s|PINUSE_BIT|CINUSE_BIT),\
hgs
parents:
diff changeset
   937
    mark_inuse_foot(M, p, s))
hgs
parents:
diff changeset
   938
#endif /* !FOOTERS */
hgs
parents:
diff changeset
   939
hgs
parents:
diff changeset
   940
hgs
parents:
diff changeset
   941
#if ONLY_MSPACES
hgs
parents:
diff changeset
   942
#define internal_malloc(m, b) mspace_malloc(m, b)
hgs
parents:
diff changeset
   943
#define internal_free(m, mem) mspace_free(m,mem);
hgs
parents:
diff changeset
   944
#else /* ONLY_MSPACES */
hgs
parents:
diff changeset
   945
    #if MSPACES
hgs
parents:
diff changeset
   946
        #define internal_malloc(m, b) (m == gm)? dlmalloc(b) : mspace_malloc(m, b)
hgs
parents:
diff changeset
   947
        #define internal_free(m, mem) if (m == gm) dlfree(mem); else mspace_free(m,mem);
hgs
parents:
diff changeset
   948
    #else /* MSPACES */
hgs
parents:
diff changeset
   949
        #define internal_malloc(m, b) dlmalloc(b)
hgs
parents:
diff changeset
   950
        #define internal_free(m, mem) dlfree(mem)
hgs
parents:
diff changeset
   951
    #endif /* MSPACES */
hgs
parents:
diff changeset
   952
#endif /* ONLY_MSPACES */
hgs
parents:
diff changeset
   953
/******CODE TO SUPORT SLAB ALLOCATOR******/
hgs
parents:
diff changeset
   954
hgs
parents:
diff changeset
   955
    #ifndef NDEBUG
hgs
parents:
diff changeset
   956
    #define CHECKING 1
hgs
parents:
diff changeset
   957
    #endif
hgs
parents:
diff changeset
   958
hgs
parents:
diff changeset
   959
    #if CHECKING
hgs
parents:
diff changeset
   960
    #ifndef ASSERT
hgs
parents:
diff changeset
   961
    #define ASSERT(x) {if (!(x)) abort();}
hgs
parents:
diff changeset
   962
    #endif
hgs
parents:
diff changeset
   963
    #define CHECK(x) x
hgs
parents:
diff changeset
   964
    #else
hgs
parents:
diff changeset
   965
    #ifndef ASSERT
hgs
parents:
diff changeset
   966
    #define ASSERT(x) (void)0
hgs
parents:
diff changeset
   967
    #endif
hgs
parents:
diff changeset
   968
    #define CHECK(x) (void)0
hgs
parents:
diff changeset
   969
    #endif
hgs
parents:
diff changeset
   970
hgs
parents:
diff changeset
   971
    class slab;
hgs
parents:
diff changeset
   972
    class slabhdr;
hgs
parents:
diff changeset
   973
    #define maxslabsize     60
hgs
parents:
diff changeset
   974
    #define pageshift       12
hgs
parents:
diff changeset
   975
    #define pagesize        (1<<pageshift)
hgs
parents:
diff changeset
   976
    #define slabshift       10
hgs
parents:
diff changeset
   977
    #define slabsize        (1 << slabshift)
hgs
parents:
diff changeset
   978
    #define cellalign       8
hgs
parents:
diff changeset
   979
    const unsigned slabfull = 0;
hgs
parents:
diff changeset
   980
    const TInt  slabsperpage    =   (int)(pagesize/slabsize);
hgs
parents:
diff changeset
   981
    #define hibit(bits) (((unsigned)bits & 0xc) ? 2 + ((unsigned)bits>>3) : ((unsigned) bits>>1))
hgs
parents:
diff changeset
   982
hgs
parents:
diff changeset
   983
    #define lowbit(bits)    (((unsigned) bits&3) ? 1 - ((unsigned)bits&1) : 3 - (((unsigned)bits>>2)&1))
hgs
parents:
diff changeset
   984
    #define maxslabsize 60
hgs
parents:
diff changeset
   985
    #define minpagepower    pageshift+2
hgs
parents:
diff changeset
   986
    #define cellalign   8
hgs
parents:
diff changeset
   987
    class slabhdr
hgs
parents:
diff changeset
   988
    {
hgs
parents:
diff changeset
   989
    public:
hgs
parents:
diff changeset
   990
        unsigned header;
hgs
parents:
diff changeset
   991
        // made up of
hgs
parents:
diff changeset
   992
        // bits   |    31    | 30..28 | 27..18 | 17..12 |  11..8  |   7..0   |
hgs
parents:
diff changeset
   993
        //        +----------+--------+--------+--------+---------+----------+
hgs
parents:
diff changeset
   994
        // field  | floating |  zero  | used-4 |  size  | pagemap | free pos |
hgs
parents:
diff changeset
   995
        //
hgs
parents:
diff changeset
   996
        slab** parent;      // reference to parent's pointer to this slab in tree
hgs
parents:
diff changeset
   997
        slab* child1;       // 1st child in tree
hgs
parents:
diff changeset
   998
        slab* child2;       // 2nd child in tree
hgs
parents:
diff changeset
   999
    };
hgs
parents:
diff changeset
  1000
hgs
parents:
diff changeset
  1001
    inline unsigned header_floating(unsigned h)
hgs
parents:
diff changeset
  1002
    {return (h&0x80000000);}
hgs
parents:
diff changeset
  1003
    const unsigned maxuse = (slabsize - sizeof(slabhdr))>>2;
hgs
parents:
diff changeset
  1004
    const unsigned firstpos = sizeof(slabhdr)>>2;
hgs
parents:
diff changeset
  1005
    #define checktree(x) (void)0
hgs
parents:
diff changeset
  1006
    template <class T> inline T floor(const T addr, unsigned aln)
hgs
parents:
diff changeset
  1007
        {return T((unsigned(addr))&~(aln-1));}
hgs
parents:
diff changeset
  1008
    template <class T> inline T ceiling(T addr, unsigned aln)
hgs
parents:
diff changeset
  1009
        {return T((unsigned(addr)+(aln-1))&~(aln-1));}
hgs
parents:
diff changeset
  1010
    template <class T> inline unsigned lowbits(T addr, unsigned aln)
hgs
parents:
diff changeset
  1011
        {return unsigned(addr)&(aln-1);}
hgs
parents:
diff changeset
  1012
    template <class T1, class T2> inline int ptrdiff(const T1* a1, const T2* a2)
hgs
parents:
diff changeset
  1013
        {return reinterpret_cast<const unsigned char*>(a1) - reinterpret_cast<const unsigned char*>(a2);}
hgs
parents:
diff changeset
  1014
    template <class T> inline T offset(T addr, signed ofs)
hgs
parents:
diff changeset
  1015
        {return T(unsigned(addr)+ofs);}
hgs
parents:
diff changeset
  1016
    class slabset
hgs
parents:
diff changeset
  1017
    {
hgs
parents:
diff changeset
  1018
    public:
hgs
parents:
diff changeset
  1019
        void* initslab(slab* s);
hgs
parents:
diff changeset
  1020
        unsigned size;
hgs
parents:
diff changeset
  1021
        slab* partial;
hgs
parents:
diff changeset
  1022
    };
hgs
parents:
diff changeset
  1023
hgs
parents:
diff changeset
  1024
    class slab : public slabhdr
hgs
parents:
diff changeset
  1025
    {
hgs
parents:
diff changeset
  1026
    public:
hgs
parents:
diff changeset
  1027
        void init(unsigned clz);
hgs
parents:
diff changeset
  1028
        //static slab* slabfor( void* p);
hgs
parents:
diff changeset
  1029
        static slab* slabfor(const void* p) ;
hgs
parents:
diff changeset
  1030
    private:
hgs
parents:
diff changeset
  1031
        unsigned char payload[slabsize-sizeof(slabhdr)];
hgs
parents:
diff changeset
  1032
    };
hgs
parents:
diff changeset
  1033
    class page
hgs
parents:
diff changeset
  1034
    {
hgs
parents:
diff changeset
  1035
    public:
hgs
parents:
diff changeset
  1036
        inline static page* pagefor(slab* s);
hgs
parents:
diff changeset
  1037
        //slab slabs;
hgs
parents:
diff changeset
  1038
        slab slabs[slabsperpage];
hgs
parents:
diff changeset
  1039
    };
hgs
parents:
diff changeset
  1040
hgs
parents:
diff changeset
  1041
hgs
parents:
diff changeset
  1042
    inline page* page::pagefor(slab* s)
hgs
parents:
diff changeset
  1043
        {return reinterpret_cast<page*>(floor(s, pagesize));}
hgs
parents:
diff changeset
  1044
    struct pagecell
hgs
parents:
diff changeset
  1045
    {
hgs
parents:
diff changeset
  1046
        void* page;
hgs
parents:
diff changeset
  1047
        unsigned size;
hgs
parents:
diff changeset
  1048
    };
hgs
parents:
diff changeset
  1049
    /******CODE TO SUPORT SLAB ALLOCATOR******/
hgs
parents:
diff changeset
  1050
hgs
parents:
diff changeset
  1051
    /****** COMMON DEFS CHUNK PAGE MAP/UNMAP *****/
hgs
parents:
diff changeset
  1052
#define CHUNK_PAGEOUT_THESHOLD (12*1024U)
hgs
parents:
diff changeset
  1053
#define CHUNK_PAGE_OUT_FLAG (98989U)
hgs
parents:
diff changeset
  1054
#define tchunk_page_align(p)    (char*)page_align((size_t)(p) + sizeof(tchunk) + TOP_FOOT_SIZE)
hgs
parents:
diff changeset
  1055
#define address_offset(HIGH, LOW)    (size_t)((char*)(HIGH) - (char*)(LOW))
hgs
parents:
diff changeset
  1056
hgs
parents:
diff changeset
  1057
/* tree_malloc_chunk pageout header operations */
hgs
parents:
diff changeset
  1058
#define set_tchunk_mem_pageout(TP, NPAGES) \
hgs
parents:
diff changeset
  1059
    { (TP)->pageout = CHUNK_PAGE_OUT_FLAG; (TP)->npages = (NPAGES); }
hgs
parents:
diff changeset
  1060
#define reset_tchunk_mem_pageout(TP) \
hgs
parents:
diff changeset
  1061
    { (TP)->pageout = 0;  (TP)->npages = 0; }
hgs
parents:
diff changeset
  1062
#define page_not_in_memory(P, S) \
hgs
parents:
diff changeset
  1063
    (  !is_small(S) &&  ( (((tchunkptr)(P))->pageout==CHUNK_PAGE_OUT_FLAG)?1:0 )  )
hgs
parents:
diff changeset
  1064
hgs
parents:
diff changeset
  1065
hgs
parents:
diff changeset
  1066
#ifdef DL_CHUNK_MEM_DEBUG
hgs
parents:
diff changeset
  1067
#define ASSERT_RCHUNK_SIZE() \
hgs
parents:
diff changeset
  1068
    {RChunk rchunk; rchunk.SetHandle(iChunkHandle); assert(iChunkSize == rchunk.Size());}
hgs
parents:
diff changeset
  1069
#define TRACE_DL_CHUNK_MAP(c_addr, csize, page_addr, page_size) \
hgs
parents:
diff changeset
  1070
    MEM_LOGF(_L8("DL_CHUNK_MAP$$:: chunk_addr=%x, chunk_size=%d, page_addr=%x, page_size=%d"), c_addr, csize, page_addr, (page_size));
hgs
parents:
diff changeset
  1071
#define TRACE_DL_CHUNK_UNMAP(c_addr, csize, page_addr, page_size) \
hgs
parents:
diff changeset
  1072
    MEM_LOGF(_L8("DL_CHUNK_UNMAP:: chunk_addr=%x, chunk_size=%d, page_addr=%x, page_size=%d"), c_addr, csize, page_addr, (page_size));
hgs
parents:
diff changeset
  1073
#else
hgs
parents:
diff changeset
  1074
#define ASSERT_RCHUNK_SIZE()
hgs
parents:
diff changeset
  1075
#define TRACE_DL_CHUNK_MAP(c_addr, csize, p_addr, psize)
hgs
parents:
diff changeset
  1076
#define TRACE_DL_CHUNK_UNMAP(c_addr, csize, p_addr, psize)
hgs
parents:
diff changeset
  1077
#endif
hgs
parents:
diff changeset
  1078
hgs
parents:
diff changeset
  1079
#ifdef OOM_LOGGING
hgs
parents:
diff changeset
  1080
#define TRACE_UNMAPPED_CHUNK(SZ) \
hgs
parents:
diff changeset
  1081
    iUnmappedChunkSize += (SZ);
hgs
parents:
diff changeset
  1082
#define MEM_DUMP_OOM_LOGS(NB, MSG) \
hgs
parents:
diff changeset
  1083
    MEM_LOG(MSG); \
hgs
parents:
diff changeset
  1084
    C_LOG(MSG); \
hgs
parents:
diff changeset
  1085
    dump_heap_logs(NB)
hgs
parents:
diff changeset
  1086
#else
hgs
parents:
diff changeset
  1087
#define MEM_DUMP_OOM_LOGS(NB, MSG)
hgs
parents:
diff changeset
  1088
#define TRACE_UNMAPPED_CHUNK(SZ)
hgs
parents:
diff changeset
  1089
#endif
hgs
parents:
diff changeset
  1090
hgs
parents:
diff changeset
  1091
    /****** COMMON DEFS PAGE MAP/UNMAP *****/
hgs
parents:
diff changeset
  1092
#endif/*__DLA__*/