⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 malloc.h

📁 ucLinux is a very good embeded sytem. Most of company use this as their development OS.
💻 H
📖 第 1 页 / 共 3 页
字号:
/*  This is a version (aka dlmalloc) of malloc/free/realloc written by  Doug Lea and released to the public domain.  Use, modify, and  redistribute this code without permission or acknowledgement in any  way you wish.  Send questions, comments, complaints, performance  data, etc to dl@cs.oswego.edu  VERSION 2.7.2 Sat Aug 17 09:07:30 2002  Doug Lea  (dl at gee)  Note: There may be an updated version of this malloc obtainable at           ftp://gee.cs.oswego.edu/pub/misc/malloc.c  Check before installing!  Hacked up for uClibc by Erik Andersen <andersen@codepoet.org>*/#include <features.h>#include <stddef.h>#include <unistd.h>#include <errno.h>#include <string.h>#include <malloc.h>#include <stdlib.h>#ifdef __UCLIBC_HAS_THREADS__#include <pthread.h>extern pthread_mutex_t __malloc_lock;# define LOCK	__pthread_mutex_lock(&__malloc_lock)# define UNLOCK	__pthread_mutex_unlock(&__malloc_lock);#else# define LOCK# define UNLOCK#endif/*  MALLOC_ALIGNMENT is the minimum alignment for malloc'ed chunks.  It must be a power of two at least 2 * (sizeof(size_t)), 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 * (sizeof(size_t)))#endif/* The corresponding bit mask value */#define MALLOC_ALIGN_MASK      (MALLOC_ALIGNMENT - 1)/*  TRIM_FASTBINS controls whether free() of a very small chunk can  immediately lead to trimming. Setting to true (1) can reduce memory  footprint, but will almost always slow down programs that use a lot  of small chunks.  Define this only if you are willing to give up some speed to more  aggressively reduce system-level memory footprint when releasing  memory in programs that use many small chunks.  You can get  essentially the same effect by setting MXFAST to 0, but this can  lead to even greater slowdowns in programs using many small chunks.  TRIM_FASTBINS is an in-between compile-time option, that disables  only those chunks bordering topmost memory from being placed in  fastbins.*/#ifndef TRIM_FASTBINS#define TRIM_FASTBINS  0#endif/*  MORECORE-related declarations. By default, rely on sbrk*//*  MORECORE is the name of the routine to call to obtain more memory  from the system.  See below for general guidance on writing  alternative MORECORE functions, as well as a version for WIN32 and a  sample version for pre-OSX macos.*/#ifndef MORECORE#define MORECORE sbrk#endif/*  MORECORE_FAILURE is the value returned upon failure of MORECORE  as well as mmap. Since it cannot be an otherwise valid memory address,  and must reflect values of standard sys calls, you probably ought not  try to redefine it.*/#ifndef MORECORE_FAILURE#define MORECORE_FAILURE (-1)#endif/*  If MORECORE_CONTIGUOUS is true, take advantage of fact that  consecutive calls to MORECORE with positive arguments always return  contiguous increasing addresses.  This is true of unix sbrk.  Even  if not defined, when regions happen to be contiguous, malloc will  permit allocations spanning regions obtained from different  calls. But defining this when applicable enables some stronger  consistency checks and space efficiencies.*/#ifndef MORECORE_CONTIGUOUS#define MORECORE_CONTIGUOUS 1#endif/*   MMAP_AS_MORECORE_SIZE is the minimum mmap size argument to use if   sbrk fails, and mmap is used as a backup (which is done only if   HAVE_MMAP).  The value must be a multiple of page size.  This   backup strategy generally applies only when systems have "holes" in   address space, so sbrk cannot perform contiguous expansion, but   there is still space available on system.  On systems for which   this is known to be useful (i.e. most linux kernels), this occurs   only when programs allocate huge amounts of memory.  Between this,   and the fact that mmap regions tend to be limited, the size should   be large, to avoid too many mmap calls and thus avoid running out   of kernel resources.*/#ifndef MMAP_AS_MORECORE_SIZE#define MMAP_AS_MORECORE_SIZE (1024 * 1024)#endif/*  The system page size. To the extent possible, this malloc manages  memory from the system in page-size units.  Note that this value is  cached during initialization into a field of malloc_state. So even  if malloc_getpagesize is a function, it is only called once.  The following mechanics for getpagesize were adapted from bsd/gnu  getpagesize.h. If none of the system-probes here apply, a value of  4096 is used, which should be OK: If they don't apply, then using  the actual value probably doesn't impact performance.*/#ifndef malloc_getpagesize#  include <unistd.h>#  define malloc_getpagesize sysconf(_SC_PAGESIZE)#else /* just guess */#  define malloc_getpagesize (4096)#endif/* mallopt tuning options *//*  M_MXFAST is the maximum request size used for "fastbins", special bins  that hold returned chunks without consolidating their spaces. This  enables future requests for chunks of the same size to be handled  very quickly, but can increase fragmentation, and thus increase the  overall memory footprint of a program.  This malloc manages fastbins very conservatively yet still  efficiently, so fragmentation is rarely a problem for values less  than or equal to the default.  The maximum supported value of MXFAST  is 80. You wouldn't want it any higher than this anyway.  Fastbins  are designed especially for use with many small structs, objects or  strings -- the default handles structs/objects/arrays with sizes up  to 16 4byte fields, or small strings representing words, tokens,  etc. Using fastbins for larger objects normally worsens  fragmentation without improving speed.  M_MXFAST is set in REQUEST size units. It is internally used in  chunksize units, which adds padding and alignment.  You can reduce  M_MXFAST to 0 to disable all use of fastbins.  This causes the malloc  algorithm to be a closer approximation of fifo-best-fit in all cases,  not just for larger requests, but will generally cause it to be  slower.*//* M_MXFAST is a standard SVID/XPG tuning option, usually listed in malloc.h */#ifndef M_MXFAST#define M_MXFAST            1#endif#ifndef DEFAULT_MXFAST#define DEFAULT_MXFAST     64#endif/*  M_TRIM_THRESHOLD is the maximum amount of unused top-most memory  to keep before releasing via malloc_trim in free().  Automatic trimming is mainly useful in long-lived programs.  Because trimming via sbrk can be slow on some systems, and can  sometimes be wasteful (in cases where programs immediately  afterward allocate more large chunks) the value should be high  enough so that your overall system performance would improve by  releasing this much memory.  The trim threshold and the mmap control parameters (see below)  can be traded off with one another. Trimming and mmapping are  two different ways of releasing unused memory back to the  system. Between these two, it is often possible to keep  system-level demands of a long-lived program down to a bare  minimum. For example, in one test suite of sessions measuring  the XF86 X server on Linux, using a trim threshold of 128K and a  mmap threshold of 192K led to near-minimal long term resource  consumption.  If you are using this malloc in a long-lived program, it should  pay to experiment with these values.  As a rough guide, you  might set to a value close to the average size of a process  (program) running on your system.  Releasing this much memory  would allow such a process to run in memory.  Generally, it's  worth it to tune for trimming rather tham memory mapping when a  program undergoes phases where several large chunks are  allocated and released in ways that can reuse each other's  storage, perhaps mixed with phases where there are no such  chunks at all.  And in well-behaved long-lived programs,  controlling release of large blocks via trimming versus mapping  is usually faster.  However, in most programs, these parameters serve mainly as  protection against the system-level effects of carrying around  massive amounts of unneeded memory. Since frequent calls to  sbrk, mmap, and munmap otherwise degrade performance, the default  parameters are set to relatively high values that serve only as  safeguards.  The trim value must be greater than page size to have any useful  effect.  To disable trimming completely, you can set to  (unsigned long)(-1)  Trim settings interact with fastbin (MXFAST) settings: Unless  TRIM_FASTBINS is defined, automatic trimming never takes place upon  freeing a chunk with size less than or equal to MXFAST. Trimming is  instead delayed until subsequent freeing of larger chunks. However,  you can still force an attempted trim by calling malloc_trim.  Also, trimming is not generally possible in cases where  the main arena is obtained via mmap.  Note that the trick some people use of mallocing a huge space and  then freeing it at program startup, in an attempt to reserve system  memory, doesn't have the intended effect under automatic trimming,  since that memory will immediately be returned to the system.*/#define M_TRIM_THRESHOLD       -1#ifndef DEFAULT_TRIM_THRESHOLD#define DEFAULT_TRIM_THRESHOLD (256 * 1024)#endif/*  M_TOP_PAD is the amount of extra `padding' space to allocate or  retain whenever sbrk is called. It is used in two ways internally:  * When sbrk is called to extend the top of the arena to satisfy  a new malloc request, this much padding is added to the sbrk  request.  * When malloc_trim is called automatically from free(),  it is used as the `pad' argument.  In both cases, the actual amount of padding is rounded  so that the end of the arena is always a system page boundary.  The main reason for using padding is to avoid calling sbrk so  often. Having even a small pad greatly reduces the likelihood  that nearly every malloc request during program start-up (or  after trimming) will invoke sbrk, which needlessly wastes  time.  Automatic rounding-up to page-size units is normally sufficient  to avoid measurable overhead, so the default is 0.  However, in  systems where sbrk is relatively slow, it can pay to increase  this value, at the expense of carrying around more memory than  the program needs.*/#define M_TOP_PAD              -2#ifndef DEFAULT_TOP_PAD#define DEFAULT_TOP_PAD        (0)#endif/*  M_MMAP_THRESHOLD is the request size threshold for using mmap()  to service a request. Requests of at least this size that cannot  be allocated using already-existing space will be serviced via mmap.  (If enough normal freed space already exists it is used instead.)  Using mmap segregates relatively large chunks of memory so that  they can be individually obtained and released from the host  system. A request serviced through mmap is never reused by any  other request (at least not directly; the system may just so  happen to remap successive requests to the same locations).  Segregating space in this way has the benefits that:   1. Mmapped space can ALWAYS be individually released back      to the system, which helps keep the system level memory      demands of a long-lived program low.   2. Mapped memory can never become `locked' between      other chunks, as can happen with normally allocated chunks, which      means that even trimming via malloc_trim would not release them.   3. On some systems with "holes" in address spaces, mmap can obtain      memory that sbrk cannot.  However, it has the disadvantages that:   1. The space cannot be reclaimed, consolidated, and then      used to service later requests, as happens with normal chunks.   2. It can lead to more wastage because of mmap page alignment      requirements   3. It causes malloc performance to be more dependent on host      system memory management support routines which may vary in      implementation quality and may impose arbitrary      limitations. Generally, servicing a request via normal      malloc steps is faster than going through a system's mmap.  The advantages of mmap nearly always outweigh disadvantages for  "large" chunks, but the value of "large" varies across systems.  The  default is an empirically derived value that works well in most  systems.*/#define M_MMAP_THRESHOLD      -3

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -