Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Data Structures | Macros | Typedefs | Functions
mymalloc.h File Reference
#include <stddef.h>

Go to the source code of this file.

Data Structures

struct  mallinfo
 

Macros

#define MSPACES   1
 
#define ONLY_MSPACES   0 /* define to a value */
 
#define NO_MALLINFO   0
 
#define dlcalloc   mycalloc
 
#define dlfree   myfree
 
#define dlmalloc   mymalloc
 
#define dlmemalign   mymemalign
 
#define dlrealloc   myrealloc
 
#define dlvalloc   myvalloc
 
#define dlpvalloc   mypvalloc
 
#define dlmallinfo   mymallinfo
 
#define dlmallopt   mymallopt
 
#define dlmalloc_trim   mymalloc_trim
 
#define dlmalloc_stats   mymalloc_stats
 
#define dlmalloc_usable_size   mymalloc_usable_size
 
#define dlmalloc_footprint   mymalloc_footprint
 
#define dlindependent_calloc   myindependent_calloc
 
#define dlindependent_comalloc   myindependent_comalloc
 
#define MALLINFO_FIELD_TYPE   size_t
 
#define STRUCT_MALLINFO_DECLARED   1
 
#define M_TRIM_THRESHOLD   (-1)
 
#define M_GRANULARITY   (-2)
 
#define M_MMAP_THRESHOLD   (-3)
 

Typedefs

typedef voidmspace
 

Functions

voiddlmalloc (size_t)
 
void dlfree (void *)
 
voiddlcalloc (size_t, size_t)
 
voiddlrealloc (void *, size_t)
 
voiddlmemalign (size_t, size_t)
 
voiddlvalloc (size_t)
 
int dlmallopt (int, int)
 
size_t dlmalloc_footprint ()
 
struct mallinfo dlmallinfo (void)
 
void ** dlindependent_calloc (size_t, size_t, void **)
 
void ** dlindependent_comalloc (size_t, size_t *, void **)
 
voiddlpvalloc (size_t)
 
int dlmalloc_trim (size_t)
 
void dlmalloc_stats ()
 
size_t dlmalloc_usable_size (void *)
 
mspace create_mspace (size_t capacity, int locked)
 
size_t destroy_mspace (mspace msp)
 
mspace create_mspace_with_base (void *base, size_t capacity, int locked)
 
int mspace_track_large_chunks (mspace msp, int enable)
 
voidmspace_malloc (mspace msp, size_t bytes)
 
void mspace_free (mspace msp, void *mem)
 
voidmspace_realloc (mspace msp, void *mem, size_t newsize)
 
voidmspace_calloc (mspace msp, size_t n_elements, size_t elem_size)
 
voidmspace_memalign (mspace msp, size_t alignment, size_t bytes)
 
void ** mspace_independent_calloc (mspace msp, size_t n_elements, size_t elem_size, void *chunks[])
 
void ** mspace_independent_comalloc (mspace msp, size_t n_elements, size_t sizes[], void *chunks[])
 
size_t mspace_footprint (mspace msp)
 
struct mallinfo mspace_mallinfo (mspace msp)
 
size_t mspace_usable_size (void *mem)
 
void mspace_malloc_stats (mspace msp)
 
int mspace_trim (mspace msp, size_t pad)
 
int mspace_mallopt (int, int)
 

Macro Definition Documentation

#define dlcalloc   mycalloc

Definition at line 47 of file mymalloc.h.

#define dlfree   myfree

Definition at line 48 of file mymalloc.h.

#define dlindependent_calloc   myindependent_calloc

Definition at line 60 of file mymalloc.h.

#define dlindependent_comalloc   myindependent_comalloc

Definition at line 61 of file mymalloc.h.

#define dlmallinfo   mymallinfo

Definition at line 54 of file mymalloc.h.

#define dlmalloc   mymalloc

Definition at line 49 of file mymalloc.h.

#define dlmalloc_footprint   mymalloc_footprint

Definition at line 59 of file mymalloc.h.

void dlmalloc_stats   mymalloc_stats

Definition at line 57 of file mymalloc.h.

#define dlmalloc_trim   mymalloc_trim

Definition at line 56 of file mymalloc.h.

#define dlmalloc_usable_size   mymalloc_usable_size

Definition at line 58 of file mymalloc.h.

#define dlmallopt   mymallopt

Definition at line 55 of file mymalloc.h.

#define dlmemalign   mymemalign

Definition at line 50 of file mymalloc.h.

#define dlpvalloc   mypvalloc

Definition at line 53 of file mymalloc.h.

#define dlrealloc   myrealloc

Definition at line 51 of file mymalloc.h.

#define dlvalloc   myvalloc

Definition at line 52 of file mymalloc.h.

#define M_GRANULARITY   (-2)

Definition at line 185 of file mymalloc.h.

#define M_MMAP_THRESHOLD   (-3)

Definition at line 186 of file mymalloc.h.

#define M_TRIM_THRESHOLD   (-1)

Definition at line 184 of file mymalloc.h.

#define MALLINFO_FIELD_TYPE   size_t

Definition at line 67 of file mymalloc.h.

#define MSPACES   1

Definition at line 28 of file mymalloc.h.

#define NO_MALLINFO   0

Definition at line 40 of file mymalloc.h.

#define ONLY_MSPACES   0 /* define to a value */

Definition at line 37 of file mymalloc.h.

#define STRUCT_MALLINFO_DECLARED   1

Definition at line 70 of file mymalloc.h.

Typedef Documentation

typedef void* mspace

Definition at line 419 of file mymalloc.h.

Function Documentation

mspace create_mspace ( size_t  capacity,
int  locked 
)

Definition at line 4974 of file mymalloc.cc.

References CALL_MMAP, CMFAIL, ensure_initialization, malloc_params::granularity, granularity_align, HAVE_MMAP, HAVE_MORECORE, python.hepunit::m, MSPACES, ONLY_MSPACES, pad_request, malloc_params::page_size, malloc_state::seg, set_lock, malloc_segment::sflags, TOP_FOOT_SIZE, USE_LOCKS, and USE_MMAP_BIT.

Referenced by calloc(), malloc(), realloc(), and valloc().

4974  {
4975 
4976  //Added by xindong
4977  std::cout << "HAVE_MORECORE: " << HAVE_MORECORE << ", "
4978  << "MSPACES: " << MSPACES << ", "
4979  << "ONLY_MSPACES: " << ONLY_MSPACES << ", "
4980  << "HAVE_MMAP: " << HAVE_MMAP << ", "
4981  << " USE_LOCKS: " << USE_LOCKS << std::endl;
4982 
4983  mstate m = 0;
4984  size_t msize;
4986  msize = pad_request(sizeof(struct malloc_state));
4987  //Commented out by xindong
4988  if (capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
4989  std::cout << "handle capacity paramenter: " << capacity << ", "
4990  << (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)
4991  << std::endl;
4992  size_t rs = ((capacity == 0)? mparams.granularity :
4993  (capacity + TOP_FOOT_SIZE + msize));
4994  size_t tsize = granularity_align(rs);
4995  char* tbase = (char*)(CALL_MMAP(tsize));
4996  if (tbase != CMFAIL) {
4997  m = init_user_mstate(tbase, tsize);
4998  m->seg.sflags = USE_MMAP_BIT;
4999  set_lock(m, locked);
5000  }
5001  }
5002  return (mspace)m;
5003 }
#define TOP_FOOT_SIZE
Definition: mymalloc.cc:2588
#define HAVE_MORECORE
Definition: mymalloc.cc:607
#define granularity_align(S)
Definition: mymalloc.cc:2531
msegment seg
Definition: mymalloc.cc:2465
#define USE_LOCKS
Definition: mymalloc.cc:575
#define CMFAIL
Definition: mymalloc.cc:1477
void * mspace
Definition: mymalloc.h:419
size_t page_size
Definition: mymalloc.cc:2483
#define HAVE_MMAP
Definition: mymalloc.cc:588
#define ensure_initialization()
Definition: mymalloc.cc:2493
#define USE_MMAP_BIT
Definition: mymalloc.cc:1568
#define set_lock(M, L)
Definition: mymalloc.cc:2521
#define MSPACES
Definition: mymalloc.cc:485
#define ONLY_MSPACES
Definition: mymalloc.cc:548
size_t granularity
Definition: mymalloc.cc:2484
#define pad_request(req)
Definition: mymalloc.cc:2101
#define CALL_MMAP(s)
Definition: mymalloc.cc:1573
mspace create_mspace_with_base ( void base,
size_t  capacity,
int  locked 
)

Definition at line 5005 of file mymalloc.cc.

References ensure_initialization, EXTERN_BIT, python.hepunit::m, pad_request, malloc_params::page_size, malloc_state::seg, set_lock, malloc_segment::sflags, and TOP_FOOT_SIZE.

5005  {
5006  mstate m = 0;
5007  size_t msize;
5009  msize = pad_request(sizeof(struct malloc_state));
5010  if (capacity > msize + TOP_FOOT_SIZE &&
5011  capacity < (size_t) -(msize + TOP_FOOT_SIZE + mparams.page_size)) {
5012  m = init_user_mstate((char*)base, capacity);
5013  m->seg.sflags = EXTERN_BIT;
5014  set_lock(m, locked);
5015  }
5016  return (mspace)m;
5017 }
#define TOP_FOOT_SIZE
Definition: mymalloc.cc:2588
msegment seg
Definition: mymalloc.cc:2465
void * mspace
Definition: mymalloc.h:419
size_t page_size
Definition: mymalloc.cc:2483
#define ensure_initialization()
Definition: mymalloc.cc:2493
#define set_lock(M, L)
Definition: mymalloc.cc:2521
const XML_Char int const XML_Char int const XML_Char * base
#define pad_request(req)
Definition: mymalloc.cc:2101
#define EXTERN_BIT
Definition: mymalloc.cc:1613
size_t destroy_mspace ( mspace  msp)

Definition at line 5034 of file mymalloc.cc.

References malloc_segment::base, CALL_MUNMAP, EXTERN_BIT, python.hepunit::ms, malloc_segment::next, ok_magic, malloc_state::seg, malloc_segment::sflags, malloc_segment::size, USAGE_ERROR_ACTION, and USE_MMAP_BIT.

5034  {
5035  size_t freed = 0;
5036  mstate ms = (mstate)msp;
5037  if (ok_magic(ms)) {
5038  msegmentptr sp = &ms->seg;
5039  while (sp != 0) {
5040  char* base = sp->base;
5041  size_t size = sp->size;
5042  flag_t flag = sp->sflags;
5043  sp = sp->next;
5044  if ((flag & USE_MMAP_BIT) && !(flag & EXTERN_BIT) &&
5045  CALL_MUNMAP(base, size) == 0)
5046  freed += size;
5047  }
5048  }
5049  else {
5050  USAGE_ERROR_ACTION(ms,ms);
5051  }
5052  return freed;
5053 }
#define CALL_MUNMAP(a, s)
Definition: mymalloc.cc:1578
msegment seg
Definition: mymalloc.cc:2465
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
struct malloc_segment * next
Definition: mymalloc.cc:2342
struct malloc_state * mstate
Definition: mymalloc.cc:2470
unsigned int flag_t
Definition: mymalloc.cc:2069
#define USE_MMAP_BIT
Definition: mymalloc.cc:1568
const XML_Char int const XML_Char int const XML_Char * base
#define ok_magic(M)
Definition: mymalloc.cc:2887
#define EXTERN_BIT
Definition: mymalloc.cc:1613
void * dlcalloc ( size_t  n_elements,
size_t  elem_size 
)

Definition at line 4837 of file mymalloc.cc.

References calloc_must_clear, dlmalloc, MAX_SIZE_T, and mem2chunk.

4837  {
4838  void* mem;
4839  size_t req = 0;
4840  if (n_elements != 0) {
4841  req = n_elements * elem_size;
4842  if (((n_elements | elem_size) & ~(size_t)0xffff) &&
4843  (req / n_elements != elem_size))
4844  req = MAX_SIZE_T; /* force downstream failure on overflow */
4845  }
4846  mem = dlmalloc(req);
4847  if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
4848  memset(mem, 0, req);
4849  return mem;
4850 }
#define MAX_SIZE_T
Definition: mymalloc.cc:545
#define mem2chunk(mem)
Definition: mymalloc.cc:2092
#define dlmalloc
Definition: mymalloc.cc:762
#define calloc_must_clear(p)
Definition: mymalloc.cc:2167
void dlfree ( void mem)

Definition at line 4728 of file mymalloc.cc.

References CALL_MUNMAP, check_free_chunk, check_inuse_chunk, chunk_minus_offset, chunk_plus_offset, chunksize, cinuse, malloc_state::dv, malloc_state::dvsize, fm, malloc_state::footprint, malloc_chunk::head, insert_large_chunk, insert_small_chunk, INUSE_BITS, is_mmapped, is_small, mem2chunk, MMAP_FOOT_PAD, ok_address, ok_inuse, ok_magic, ok_next, ok_pinuse, pinuse, PINUSE_BIT, POSTACTION, PREACTION, malloc_chunk::prev_foot, malloc_state::release_checks, RTCHECK, set_free_with_pinuse, set_size_and_pinuse_of_free_chunk, should_trim, malloc_state::top, malloc_state::topsize, unlink_chunk, and USAGE_ERROR_ACTION.

4728  {
4729  /*
4730  Consolidate freed chunks with preceeding or succeeding bordering
4731  free chunks, if they exist, and then place in a bin. Intermixed
4732  with special cases for top, dv, mmapped chunks, and usage errors.
4733  */
4734 
4735  if (mem != 0) {
4736  mchunkptr p = mem2chunk(mem);
4737 #if FOOTERS
4738  mstate fm = get_mstate_for(p);
4739  if (!ok_magic(fm)) {
4740  USAGE_ERROR_ACTION(fm, p);
4741  return;
4742  }
4743 #else /* FOOTERS */
4744 #define fm gm
4745 #endif /* FOOTERS */
4746  if (!PREACTION(fm)) {
4747  check_inuse_chunk(fm, p);
4748  if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) {
4749  size_t psize = chunksize(p);
4750  mchunkptr next = chunk_plus_offset(p, psize);
4751  if (!pinuse(p)) {
4752  size_t prevsize = p->prev_foot;
4753  if (is_mmapped(p)) {
4754  psize += prevsize + MMAP_FOOT_PAD;
4755  if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
4756  fm->footprint -= psize;
4757  goto postaction;
4758  }
4759  else {
4760  mchunkptr prev = chunk_minus_offset(p, prevsize);
4761  psize += prevsize;
4762  p = prev;
4763  if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
4764  if (p != fm->dv) {
4765  unlink_chunk(fm, p, prevsize);
4766  }
4767  else if ((next->head & INUSE_BITS) == INUSE_BITS) {
4768  fm->dvsize = psize;
4769  set_free_with_pinuse(p, psize, next);
4770  goto postaction;
4771  }
4772  }
4773  else
4774  goto erroraction;
4775  }
4776  }
4777 
4778  if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
4779  if (!cinuse(next)) { /* consolidate forward */
4780  if (next == fm->top) {
4781  size_t tsize = fm->topsize += psize;
4782  fm->top = p;
4783  p->head = tsize | PINUSE_BIT;
4784  if (p == fm->dv) {
4785  fm->dv = 0;
4786  fm->dvsize = 0;
4787  }
4788  if (should_trim(fm, tsize))
4789  sys_trim(fm, 0);
4790  goto postaction;
4791  }
4792  else if (next == fm->dv) {
4793  size_t dsize = fm->dvsize += psize;
4794  fm->dv = p;
4796  goto postaction;
4797  }
4798  else {
4799  size_t nsize = chunksize(next);
4800  psize += nsize;
4801  unlink_chunk(fm, next, nsize);
4803  if (p == fm->dv) {
4804  fm->dvsize = psize;
4805  goto postaction;
4806  }
4807  }
4808  }
4809  else
4810  set_free_with_pinuse(p, psize, next);
4811 
4812  if (is_small(psize)) {
4813  insert_small_chunk(fm, p, psize);
4814  check_free_chunk(fm, p);
4815  }
4816  else {
4817  tchunkptr tp = (tchunkptr)p;
4818  insert_large_chunk(fm, tp, psize);
4819  check_free_chunk(fm, p);
4820  if (--fm->release_checks == 0)
4821  release_unused_segments(fm);
4822  }
4823  goto postaction;
4824  }
4825  }
4826  erroraction:
4827  USAGE_ERROR_ACTION(fm, p);
4828  postaction:
4829  POSTACTION(fm);
4830  }
4831  }
4832 #if !FOOTERS
4833 #undef fm
4834 #endif /* FOOTERS */
4835 }
#define chunk_minus_offset(p, s)
Definition: mymalloc.cc:2140
#define pinuse(p)
Definition: mymalloc.cc:2130
mchunkptr top
Definition: mymalloc.cc:2453
struct malloc_tree_chunk * tchunkptr
Definition: mymalloc.cc:2276
#define insert_small_chunk(M, P, S)
Definition: mymalloc.cc:3415
#define CALL_MUNMAP(a, s)
Definition: mymalloc.cc:1578
#define PINUSE_BIT
Definition: mymalloc.cc:2119
const char * p
Definition: xmltok.h:285
#define is_small(s)
Definition: mymalloc.cc:2682
#define is_mmapped(p)
Definition: mymalloc.cc:2132
size_t release_checks
Definition: mymalloc.cc:2455
#define chunk_plus_offset(p, s)
Definition: mymalloc.cc:2139
#define POSTACTION(M)
Definition: mymalloc.cc:2611
#define cinuse(p)
Definition: mymalloc.cc:2129
#define ok_pinuse(p)
Definition: mymalloc.cc:2874
size_t head
Definition: mymalloc.cc:2059
#define chunksize(p)
Definition: mymalloc.cc:2134
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
size_t prev_foot
Definition: mymalloc.cc:2058
#define PREACTION(M)
Definition: mymalloc.cc:2607
#define MMAP_FOOT_PAD
Definition: mymalloc.cc:2084
#define mem2chunk(mem)
Definition: mymalloc.cc:2092
#define unlink_chunk(M, P, S)
Definition: mymalloc.cc:3633
#define should_trim(M, s)
Definition: mymalloc.cc:2578
#define check_free_chunk(M, P)
Definition: mymalloc.cc:2651
#define set_size_and_pinuse_of_free_chunk(p, s)
Definition: mymalloc.cc:2154
#define check_inuse_chunk(M, P)
Definition: mymalloc.cc:2652
#define ok_inuse(p)
Definition: mymalloc.cc:2872
#define insert_large_chunk(M, X, S)
Definition: mymalloc.cc:3488
#define fm
#define ok_next(p, n)
Definition: mymalloc.cc:2870
size_t topsize
Definition: mymalloc.cc:2450
#define ok_address(M, a)
Definition: mymalloc.cc:2868
size_t dvsize
Definition: mymalloc.cc:2449
#define ok_magic(M)
Definition: mymalloc.cc:2887
mchunkptr dv
Definition: mymalloc.cc:2452
size_t footprint
Definition: mymalloc.cc:2459
#define INUSE_BITS
Definition: mymalloc.cc:2122
#define RTCHECK(e)
Definition: mymalloc.cc:2896
#define set_free_with_pinuse(p, s, n)
Definition: mymalloc.cc:2158
void** dlindependent_calloc ( size_t  ,
size_t  ,
void **   
)
void** dlindependent_comalloc ( size_t  ,
size_t *  ,
void **   
)
struct mallinfo dlmallinfo ( void  )

Definition at line 4923 of file mymalloc.cc.

References gm.

4923  {
4924  return internal_mallinfo(gm);
4925 }
#define gm
Definition: mymalloc.cc:2499
void * dlmalloc ( size_t  bytes)

Definition at line 4592 of file mymalloc.cc.

References assert, test::b, check_malloced_chunk, check_top_chunk, chunk2mem, chunk_plus_offset, chunksize, compute_bit2idx, ensure_initialization, malloc_chunk::fd, gm, malloc_chunk::head, idx2bit, least_bit, left_bits, MAX_REQUEST, MAX_SIZE_T, MAX_SMALL_REQUEST, MIN_CHUNK_SIZE, MIN_REQUEST, pad_request, PINUSE_BIT, POSTACTION, PREACTION, replace_dv, set_inuse_and_pinuse, set_size_and_pinuse_of_free_chunk, set_size_and_pinuse_of_inuse_chunk, SIZE_T_SIZE, small_index, small_index2size, smallbin_at, and unlink_first_small_chunk.

4592  {
4593  /*
4594  Basic algorithm:
4595  If a small request (< 256 bytes minus per-chunk overhead):
4596  1. If one exists, use a remainderless chunk in associated smallbin.
4597  (Remainderless means that there are too few excess bytes to
4598  represent as a chunk.)
4599  2. If it is big enough, use the dv chunk, which is normally the
4600  chunk adjacent to the one used for the most recent small request.
4601  3. If one exists, split the smallest available chunk in a bin,
4602  saving remainder in dv.
4603  4. If it is big enough, use the top chunk.
4604  5. If available, get memory from system and use it
4605  Otherwise, for a large request:
4606  1. Find the smallest available binned chunk that fits, and use it
4607  if it is better fitting than dv chunk, splitting if necessary.
4608  2. If better fitting than any binned chunk, use the dv chunk.
4609  3. If it is big enough, use the top chunk.
4610  4. If request size >= mmap threshold, try to directly mmap this chunk.
4611  5. If available, get memory from system and use it
4612 
4613  The ugly goto's here ensure that postaction occurs along all paths.
4614  */
4615 
4616 #if USE_LOCKS
4617  ensure_initialization(); /* initialize in sys_alloc if not using locks */
4618 #endif
4619 
4620  if (!PREACTION(gm)) {
4621  void* mem;
4622  size_t nb;
4623  if (bytes <= MAX_SMALL_REQUEST) {
4624  bindex_t idx;
4625  binmap_t smallbits;
4626  nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
4627  idx = small_index(nb);
4628  smallbits = gm->smallmap >> idx;
4629 
4630  if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
4631  mchunkptr b, p;
4632  idx += ~smallbits & 1; /* Uses next bin if idx empty */
4633  b = smallbin_at(gm, idx);
4634  p = b->fd;
4635  assert(chunksize(p) == small_index2size(idx));
4636  unlink_first_small_chunk(gm, b, p, idx);
4638  mem = chunk2mem(p);
4639  check_malloced_chunk(gm, mem, nb);
4640  goto postaction;
4641  }
4642 
4643  else if (nb > gm->dvsize) {
4644  if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
4645  mchunkptr b, p, r;
4646  size_t rsize;
4647  bindex_t i;
4648  binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
4649  binmap_t leastbit = least_bit(leftbits);
4650  compute_bit2idx(leastbit, i);
4651  b = smallbin_at(gm, i);
4652  p = b->fd;
4653  assert(chunksize(p) == small_index2size(i));
4654  unlink_first_small_chunk(gm, b, p, i);
4655  rsize = small_index2size(i) - nb;
4656  /* Fit here cannot be remainderless if 4byte sizes */
4657  if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
4659  else {
4661  r = chunk_plus_offset(p, nb);
4663  replace_dv(gm, r, rsize);
4664  }
4665  mem = chunk2mem(p);
4666  check_malloced_chunk(gm, mem, nb);
4667  goto postaction;
4668  }
4669 
4670  else if (gm->treemap != 0 && (mem = tmalloc_small(gm, nb)) != 0) {
4671  check_malloced_chunk(gm, mem, nb);
4672  goto postaction;
4673  }
4674  }
4675  }
4676  else if (bytes >= MAX_REQUEST)
4677  nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
4678  else {
4679  nb = pad_request(bytes);
4680  if (gm->treemap != 0 && (mem = tmalloc_large(gm, nb)) != 0) {
4681  check_malloced_chunk(gm, mem, nb);
4682  goto postaction;
4683  }
4684  }
4685 
4686  if (nb <= gm->dvsize) {
4687  size_t rsize = gm->dvsize - nb;
4688  mchunkptr p = gm->dv;
4689  if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
4690  mchunkptr r = gm->dv = chunk_plus_offset(p, nb);
4691  gm->dvsize = rsize;
4694  }
4695  else { /* exhaust dv */
4696  size_t dvs = gm->dvsize;
4697  gm->dvsize = 0;
4698  gm->dv = 0;
4699  set_inuse_and_pinuse(gm, p, dvs);
4700  }
4701  mem = chunk2mem(p);
4702  check_malloced_chunk(gm, mem, nb);
4703  goto postaction;
4704  }
4705 
4706  else if (nb < gm->topsize) { /* Split top */
4707  size_t rsize = gm->topsize -= nb;
4708  mchunkptr p = gm->top;
4709  mchunkptr r = gm->top = chunk_plus_offset(p, nb);
4710  r->head = rsize | PINUSE_BIT;
4712  mem = chunk2mem(p);
4713  check_top_chunk(gm, gm->top);
4714  check_malloced_chunk(gm, mem, nb);
4715  goto postaction;
4716  }
4717 
4718  mem = sys_alloc(gm, nb);
4719 
4720  postaction:
4721  POSTACTION(gm);
4722  return mem;
4723  }
4724 
4725  return 0;
4726 }
#define gm
Definition: mymalloc.cc:2499
#define idx2bit(i)
Definition: mymalloc.cc:2774
#define MAX_SIZE_T
Definition: mymalloc.cc:545
#define unlink_first_small_chunk(M, B, P, I)
Definition: mymalloc.cc:3454
#define small_index2size(i)
Definition: mymalloc.cc:2684
#define PINUSE_BIT
Definition: mymalloc.cc:2119
const char * p
Definition: xmltok.h:285
#define assert(x)
Definition: mymalloc.cc:1309
#define chunk_plus_offset(p, s)
Definition: mymalloc.cc:2139
#define POSTACTION(M)
Definition: mymalloc.cc:2611
#define smallbin_at(M, i)
Definition: mymalloc.cc:2688
#define chunk2mem(p)
Definition: mymalloc.cc:2091
unsigned int bindex_t
Definition: mymalloc.cc:2067
size_t head
Definition: mymalloc.cc:2059
#define left_bits(x)
Definition: mymalloc.cc:2789
#define chunksize(p)
Definition: mymalloc.cc:2134
unsigned int binmap_t
Definition: mymalloc.cc:2068
#define MIN_REQUEST
Definition: mymalloc.cc:2098
#define PREACTION(M)
Definition: mymalloc.cc:2607
#define compute_bit2idx(X, I)
Definition: mymalloc.cc:2824
#define ensure_initialization()
Definition: mymalloc.cc:2493
struct malloc_chunk * fd
Definition: mymalloc.cc:2060
#define small_index(s)
Definition: mymalloc.cc:2683
#define check_top_chunk(M, P)
Definition: mymalloc.cc:2656
#define set_size_and_pinuse_of_free_chunk(p, s)
Definition: mymalloc.cc:2154
#define MAX_REQUEST
Definition: mymalloc.cc:2097
#define check_malloced_chunk(M, P, N)
Definition: mymalloc.cc:2653
#define SIZE_T_SIZE
Definition: mymalloc.cc:1441
#define set_size_and_pinuse_of_inuse_chunk(M, p, s)
Definition: mymalloc.cc:2921
#define replace_dv(M, P, S)
Definition: mymalloc.cc:3474
#define pad_request(req)
Definition: mymalloc.cc:2101
#define least_bit(x)
Definition: mymalloc.cc:2786
#define MIN_CHUNK_SIZE
Definition: mymalloc.cc:2087
#define MAX_SMALL_REQUEST
Definition: mymalloc.cc:2444
#define set_inuse_and_pinuse(M, p, s)
Definition: mymalloc.cc:2916
size_t dlmalloc_footprint ( void  )

Definition at line 4914 of file mymalloc.cc.

References gm.

4914  {
4915  return gm->footprint;
4916 }
#define gm
Definition: mymalloc.cc:2499
void dlmalloc_stats ( )

Definition at line 4928 of file mymalloc.cc.

References gm.

4928  {
4929  internal_malloc_stats(gm);
4930 }
#define gm
Definition: mymalloc.cc:2499
int dlmalloc_trim ( size_t  pad)

Definition at line 4904 of file mymalloc.cc.

References ensure_initialization, gm, POSTACTION, and PREACTION.

4904  {
4905  int result = 0;
4907  if (!PREACTION(gm)) {
4908  result = sys_trim(gm, pad);
4909  POSTACTION(gm);
4910  }
4911  return result;
4912 }
#define gm
Definition: mymalloc.cc:2499
#define POSTACTION(M)
Definition: mymalloc.cc:2611
#define PREACTION(M)
Definition: mymalloc.cc:2607
#define ensure_initialization()
Definition: mymalloc.cc:2493
size_t dlmalloc_usable_size ( void mem)

Definition at line 4938 of file mymalloc.cc.

References chunksize, is_inuse, mem2chunk, and overhead_for.

4938  {
4939  if (mem != 0) {
4940  mchunkptr p = mem2chunk(mem);
4941  if (is_inuse(p))
4942  return chunksize(p) - overhead_for(p);
4943  }
4944  return 0;
4945 }
const char * p
Definition: xmltok.h:285
#define chunksize(p)
Definition: mymalloc.cc:2134
#define mem2chunk(mem)
Definition: mymalloc.cc:2092
#define is_inuse(p)
Definition: mymalloc.cc:2131
#define overhead_for(p)
Definition: mymalloc.cc:2162
int dlmallopt ( int  param_number,
int  value 
)

Definition at line 4932 of file mymalloc.cc.

4932  {
4933  return change_mparam(param_number, value);
4934 }
const XML_Char int const XML_Char * value
void * dlmemalign ( size_t  alignment,
size_t  bytes 
)

Definition at line 4875 of file mymalloc.cc.

References gm.

4875  {
4876  return internal_memalign(gm, alignment, bytes);
4877 }
#define gm
Definition: mymalloc.cc:2499
void * dlpvalloc ( size_t  bytes)

Definition at line 4897 of file mymalloc.cc.

References dlmemalign, ensure_initialization, malloc_params::page_size, and SIZE_T_ONE.

4897  {
4898  size_t pagesz;
4900  pagesz = mparams.page_size;
4901  return dlmemalign(pagesz, (bytes + pagesz - SIZE_T_ONE) & ~(pagesz - SIZE_T_ONE));
4902 }
#define SIZE_T_ONE
Definition: mymalloc.cc:1447
#define dlmemalign
Definition: mymalloc.cc:763
size_t page_size
Definition: mymalloc.cc:2483
#define ensure_initialization()
Definition: mymalloc.cc:2493
void * dlrealloc ( void oldmem,
size_t  bytes 
)

Definition at line 4852 of file mymalloc.cc.

References dlfree, dlmalloc, gm, mem2chunk, ok_magic, and USAGE_ERROR_ACTION.

4852  {
4853  if (oldmem == 0)
4854  return dlmalloc(bytes);
4855 #ifdef REALLOC_ZERO_BYTES_FREES
4856  if (bytes == 0) {
4857  dlfree(oldmem);
4858  return 0;
4859  }
4860 #endif /* REALLOC_ZERO_BYTES_FREES */
4861  else {
4862 #if ! FOOTERS
4863  mstate m = gm;
4864 #else /* FOOTERS */
4865  mstate m = get_mstate_for(mem2chunk(oldmem));
4866  if (!ok_magic(m)) {
4867  USAGE_ERROR_ACTION(m, oldmem);
4868  return 0;
4869  }
4870 #endif /* FOOTERS */
4871  return internal_realloc(m, oldmem, bytes);
4872  }
4873 }
#define gm
Definition: mymalloc.cc:2499
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
#define mem2chunk(mem)
Definition: mymalloc.cc:2092
#define dlmalloc
Definition: mymalloc.cc:762
#define ok_magic(M)
Definition: mymalloc.cc:2887
#define dlfree
Definition: mymalloc.cc:761
void * dlvalloc ( size_t  bytes)

Definition at line 4890 of file mymalloc.cc.

References dlmemalign, ensure_initialization, and malloc_params::page_size.

4890  {
4891  size_t pagesz;
4893  pagesz = mparams.page_size;
4894  return dlmemalign(pagesz, bytes);
4895 }
#define dlmemalign
Definition: mymalloc.cc:763
size_t page_size
Definition: mymalloc.cc:2483
#define ensure_initialization()
Definition: mymalloc.cc:2493
void * mspace_calloc ( mspace  msp,
size_t  n_elements,
size_t  elem_size 
)

Definition at line 5276 of file mymalloc.cc.

References calloc_must_clear, internal_malloc, MAX_SIZE_T, mem2chunk, python.hepunit::ms, ok_magic, and USAGE_ERROR_ACTION.

Referenced by calloc().

5276  {
5277  void* mem;
5278  size_t req = 0;
5279  mstate ms = (mstate)msp;
5280  if (!ok_magic(ms)) {
5281  USAGE_ERROR_ACTION(ms,ms);
5282  return 0;
5283  }
5284  if (n_elements != 0) {
5285  req = n_elements * elem_size;
5286  if (((n_elements | elem_size) & ~(size_t)0xffff) &&
5287  (req / n_elements != elem_size))
5288  req = MAX_SIZE_T; /* force downstream failure on overflow */
5289  }
5290  mem = internal_malloc(ms, req);
5291  if (mem != 0 && calloc_must_clear(mem2chunk(mem)))
5292  memset(mem, 0, req);
5293  return mem;
5294 }
#define MAX_SIZE_T
Definition: mymalloc.cc:545
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
#define mem2chunk(mem)
Definition: mymalloc.cc:2092
struct malloc_state * mstate
Definition: mymalloc.cc:2470
#define ok_magic(M)
Definition: mymalloc.cc:2887
#define internal_malloc(m, b)
Definition: mymalloc.cc:3645
#define calloc_must_clear(p)
Definition: mymalloc.cc:2167
size_t mspace_footprint ( mspace  msp)

Definition at line 5375 of file mymalloc.cc.

References malloc_state::footprint, python.hepunit::ms, ok_magic, and USAGE_ERROR_ACTION.

5375  {
5376  size_t result = 0;
5377  mstate ms = (mstate)msp;
5378  if (ok_magic(ms)) {
5379  result = ms->footprint;
5380  }
5381  else {
5382  USAGE_ERROR_ACTION(ms,ms);
5383  }
5384  return result;
5385 }
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
struct malloc_state * mstate
Definition: mymalloc.cc:2470
#define ok_magic(M)
Definition: mymalloc.cc:2887
size_t footprint
Definition: mymalloc.cc:2459
void mspace_free ( mspace  msp,
void mem 
)

Definition at line 5175 of file mymalloc.cc.

References CALL_MUNMAP, check_free_chunk, check_inuse_chunk, chunk_minus_offset, chunk_plus_offset, chunksize, cinuse, malloc_state::dv, malloc_state::dvsize, fm, malloc_state::footprint, malloc_chunk::head, insert_large_chunk, insert_small_chunk, INUSE_BITS, is_mmapped, is_small, mem2chunk, MMAP_FOOT_PAD, ok_address, ok_inuse, ok_magic, ok_next, ok_pinuse, pinuse, PINUSE_BIT, POSTACTION, PREACTION, malloc_chunk::prev_foot, malloc_state::release_checks, RTCHECK, set_free_with_pinuse, set_size_and_pinuse_of_free_chunk, should_trim, malloc_state::top, malloc_state::topsize, unlink_chunk, and USAGE_ERROR_ACTION.

Referenced by cfree(), free(), and mspace_realloc().

5175  {
5176  if (mem != 0) {
5177  mchunkptr p = mem2chunk(mem);
5178 #if FOOTERS
5179  mstate fm = get_mstate_for(p);
5180  msp = msp; /* placate people compiling -Wunused */
5181 #else /* FOOTERS */
5182  mstate fm = (mstate)msp;
5183 #endif /* FOOTERS */
5184  if (!ok_magic(fm)) {
5185  USAGE_ERROR_ACTION(fm, p);
5186  return;
5187  }
5188  if (!PREACTION(fm)) {
5189  check_inuse_chunk(fm, p);
5190  if (RTCHECK(ok_address(fm, p) && ok_inuse(p))) {
5191  size_t psize = chunksize(p);
5192  mchunkptr next = chunk_plus_offset(p, psize);
5193  if (!pinuse(p)) {
5194  size_t prevsize = p->prev_foot;
5195  if (is_mmapped(p)) {
5196  psize += prevsize + MMAP_FOOT_PAD;
5197  if (CALL_MUNMAP((char*)p - prevsize, psize) == 0)
5198  fm->footprint -= psize;
5199  goto postaction;
5200  }
5201  else {
5202  mchunkptr prev = chunk_minus_offset(p, prevsize);
5203  psize += prevsize;
5204  p = prev;
5205  if (RTCHECK(ok_address(fm, prev))) { /* consolidate backward */
5206  if (p != fm->dv) {
5207  unlink_chunk(fm, p, prevsize);
5208  }
5209  else if ((next->head & INUSE_BITS) == INUSE_BITS) {
5210  fm->dvsize = psize;
5211  set_free_with_pinuse(p, psize, next);
5212  goto postaction;
5213  }
5214  }
5215  else
5216  goto erroraction;
5217  }
5218  }
5219 
5220  if (RTCHECK(ok_next(p, next) && ok_pinuse(next))) {
5221  if (!cinuse(next)) { /* consolidate forward */
5222  if (next == fm->top) {
5223  size_t tsize = fm->topsize += psize;
5224  fm->top = p;
5225  p->head = tsize | PINUSE_BIT;
5226  if (p == fm->dv) {
5227  fm->dv = 0;
5228  fm->dvsize = 0;
5229  }
5230  if (should_trim(fm, tsize))
5231  sys_trim(fm, 0);
5232  goto postaction;
5233  }
5234  else if (next == fm->dv) {
5235  size_t dsize = fm->dvsize += psize;
5236  fm->dv = p;
5238  goto postaction;
5239  }
5240  else {
5241  size_t nsize = chunksize(next);
5242  psize += nsize;
5243  unlink_chunk(fm, next, nsize);
5245  if (p == fm->dv) {
5246  fm->dvsize = psize;
5247  goto postaction;
5248  }
5249  }
5250  }
5251  else
5252  set_free_with_pinuse(p, psize, next);
5253 
5254  if (is_small(psize)) {
5255  insert_small_chunk(fm, p, psize);
5256  check_free_chunk(fm, p);
5257  }
5258  else {
5259  tchunkptr tp = (tchunkptr)p;
5260  insert_large_chunk(fm, tp, psize);
5261  check_free_chunk(fm, p);
5262  if (--fm->release_checks == 0)
5263  release_unused_segments(fm);
5264  }
5265  goto postaction;
5266  }
5267  }
5268  erroraction:
5269  USAGE_ERROR_ACTION(fm, p);
5270  postaction:
5271  POSTACTION(fm);
5272  }
5273  }
5274 }
#define chunk_minus_offset(p, s)
Definition: mymalloc.cc:2140
#define pinuse(p)
Definition: mymalloc.cc:2130
mchunkptr top
Definition: mymalloc.cc:2453
struct malloc_tree_chunk * tchunkptr
Definition: mymalloc.cc:2276
#define insert_small_chunk(M, P, S)
Definition: mymalloc.cc:3415
#define CALL_MUNMAP(a, s)
Definition: mymalloc.cc:1578
#define PINUSE_BIT
Definition: mymalloc.cc:2119
const char * p
Definition: xmltok.h:285
#define is_small(s)
Definition: mymalloc.cc:2682
#define is_mmapped(p)
Definition: mymalloc.cc:2132
size_t release_checks
Definition: mymalloc.cc:2455
#define chunk_plus_offset(p, s)
Definition: mymalloc.cc:2139
#define POSTACTION(M)
Definition: mymalloc.cc:2611
#define cinuse(p)
Definition: mymalloc.cc:2129
#define ok_pinuse(p)
Definition: mymalloc.cc:2874
size_t head
Definition: mymalloc.cc:2059
#define chunksize(p)
Definition: mymalloc.cc:2134
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
size_t prev_foot
Definition: mymalloc.cc:2058
#define PREACTION(M)
Definition: mymalloc.cc:2607
#define MMAP_FOOT_PAD
Definition: mymalloc.cc:2084
#define mem2chunk(mem)
Definition: mymalloc.cc:2092
struct malloc_state * mstate
Definition: mymalloc.cc:2470
#define unlink_chunk(M, P, S)
Definition: mymalloc.cc:3633
#define should_trim(M, s)
Definition: mymalloc.cc:2578
#define check_free_chunk(M, P)
Definition: mymalloc.cc:2651
#define set_size_and_pinuse_of_free_chunk(p, s)
Definition: mymalloc.cc:2154
#define check_inuse_chunk(M, P)
Definition: mymalloc.cc:2652
#define ok_inuse(p)
Definition: mymalloc.cc:2872
#define insert_large_chunk(M, X, S)
Definition: mymalloc.cc:3488
#define fm
#define ok_next(p, n)
Definition: mymalloc.cc:2870
size_t topsize
Definition: mymalloc.cc:2450
#define ok_address(M, a)
Definition: mymalloc.cc:2868
size_t dvsize
Definition: mymalloc.cc:2449
#define ok_magic(M)
Definition: mymalloc.cc:2887
mchunkptr dv
Definition: mymalloc.cc:2452
size_t footprint
Definition: mymalloc.cc:2459
#define INUSE_BITS
Definition: mymalloc.cc:2122
#define RTCHECK(e)
Definition: mymalloc.cc:2896
#define set_free_with_pinuse(p, s, n)
Definition: mymalloc.cc:2158
void ** mspace_independent_calloc ( mspace  msp,
size_t  n_elements,
size_t  elem_size,
void chunks[] 
)

Definition at line 5329 of file mymalloc.cc.

References python.hepunit::ms, ok_magic, and USAGE_ERROR_ACTION.

5330  {
5331  size_t sz = elem_size; /* serves as 1-element array */
5332  mstate ms = (mstate)msp;
5333  if (!ok_magic(ms)) {
5334  USAGE_ERROR_ACTION(ms,ms);
5335  return 0;
5336  }
5337  return ialloc(ms, n_elements, &sz, 3, chunks);
5338 }
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
struct malloc_state * mstate
Definition: mymalloc.cc:2470
#define ok_magic(M)
Definition: mymalloc.cc:2887
void ** mspace_independent_comalloc ( mspace  msp,
size_t  n_elements,
size_t  sizes[],
void chunks[] 
)

Definition at line 5340 of file mymalloc.cc.

References python.hepunit::ms, ok_magic, and USAGE_ERROR_ACTION.

5341  {
5342  mstate ms = (mstate)msp;
5343  if (!ok_magic(ms)) {
5344  USAGE_ERROR_ACTION(ms,ms);
5345  return 0;
5346  }
5347  return ialloc(ms, n_elements, sizes, 0, chunks);
5348 }
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
struct malloc_state * mstate
Definition: mymalloc.cc:2470
#define ok_magic(M)
Definition: mymalloc.cc:2887
struct mallinfo mspace_mallinfo ( mspace  msp)

Definition at line 5402 of file mymalloc.cc.

References python.hepunit::ms, ok_magic, and USAGE_ERROR_ACTION.

5402  {
5403  mstate ms = (mstate)msp;
5404  if (!ok_magic(ms)) {
5405  USAGE_ERROR_ACTION(ms,ms);
5406  }
5407  return internal_mallinfo(ms);
5408 }
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
struct malloc_state * mstate
Definition: mymalloc.cc:2470
#define ok_magic(M)
Definition: mymalloc.cc:2887
void * mspace_malloc ( mspace  msp,
size_t  bytes 
)

Definition at line 5061 of file mymalloc.cc.

References assert, test::b, check_malloced_chunk, check_top_chunk, chunk2mem, chunk_plus_offset, chunksize, compute_bit2idx, malloc_state::dv, malloc_state::dvsize, malloc_chunk::fd, malloc_chunk::head, idx2bit, least_bit, left_bits, MAX_REQUEST, MAX_SIZE_T, MAX_SMALL_REQUEST, MIN_CHUNK_SIZE, MIN_REQUEST, python.hepunit::ms, ok_magic, pad_request, PINUSE_BIT, POSTACTION, PREACTION, replace_dv, set_inuse_and_pinuse, set_size_and_pinuse_of_free_chunk, set_size_and_pinuse_of_inuse_chunk, SIZE_T_SIZE, small_index, small_index2size, smallbin_at, malloc_state::smallmap, malloc_state::top, malloc_state::topsize, malloc_state::treemap, unlink_first_small_chunk, and USAGE_ERROR_ACTION.

Referenced by malloc(), mspace_realloc(), and valloc().

5061  {
5062  mstate ms = (mstate)msp;
5063  if (!ok_magic(ms)) {
5064  USAGE_ERROR_ACTION(ms,ms);
5065  return 0;
5066  }
5067  if (!PREACTION(ms)) {
5068  void* mem;
5069  size_t nb;
5070  if (bytes <= MAX_SMALL_REQUEST) {
5071  bindex_t idx;
5072  binmap_t smallbits;
5073  nb = (bytes < MIN_REQUEST)? MIN_CHUNK_SIZE : pad_request(bytes);
5074  idx = small_index(nb);
5075  smallbits = ms->smallmap >> idx;
5076 
5077  if ((smallbits & 0x3U) != 0) { /* Remainderless fit to a smallbin. */
5078  mchunkptr b, p;
5079  idx += ~smallbits & 1; /* Uses next bin if idx empty */
5080  b = smallbin_at(ms, idx);
5081  p = b->fd;
5082  assert(chunksize(p) == small_index2size(idx));
5083  unlink_first_small_chunk(ms, b, p, idx);
5085  mem = chunk2mem(p);
5086  check_malloced_chunk(ms, mem, nb);
5087  goto postaction;
5088  }
5089 
5090  else if (nb > ms->dvsize) {
5091  if (smallbits != 0) { /* Use chunk in next nonempty smallbin */
5092  mchunkptr b, p, r;
5093  size_t rsize;
5094  bindex_t i;
5095  binmap_t leftbits = (smallbits << idx) & left_bits(idx2bit(idx));
5096  binmap_t leastbit = least_bit(leftbits);
5097  compute_bit2idx(leastbit, i);
5098  b = smallbin_at(ms, i);
5099  p = b->fd;
5100  assert(chunksize(p) == small_index2size(i));
5101  unlink_first_small_chunk(ms, b, p, i);
5102  rsize = small_index2size(i) - nb;
5103  /* Fit here cannot be remainderless if 4byte sizes */
5104  if (SIZE_T_SIZE != 4 && rsize < MIN_CHUNK_SIZE)
5106  else {
5108  r = chunk_plus_offset(p, nb);
5110  replace_dv(ms, r, rsize);
5111  }
5112  mem = chunk2mem(p);
5113  check_malloced_chunk(ms, mem, nb);
5114  goto postaction;
5115  }
5116 
5117  else if (ms->treemap != 0 && (mem = tmalloc_small(ms, nb)) != 0) {
5118  check_malloced_chunk(ms, mem, nb);
5119  goto postaction;
5120  }
5121  }
5122  }
5123  else if (bytes >= MAX_REQUEST)
5124  nb = MAX_SIZE_T; /* Too big to allocate. Force failure (in sys alloc) */
5125  else {
5126  nb = pad_request(bytes);
5127  if (ms->treemap != 0 && (mem = tmalloc_large(ms, nb)) != 0) {
5128  check_malloced_chunk(ms, mem, nb);
5129  goto postaction;
5130  }
5131  }
5132 
5133  if (nb <= ms->dvsize) {
5134  size_t rsize = ms->dvsize - nb;
5135  mchunkptr p = ms->dv;
5136  if (rsize >= MIN_CHUNK_SIZE) { /* split dv */
5137  mchunkptr r = ms->dv = chunk_plus_offset(p, nb);
5138  ms->dvsize = rsize;
5141  }
5142  else { /* exhaust dv */
5143  size_t dvs = ms->dvsize;
5144  ms->dvsize = 0;
5145  ms->dv = 0;
5146  set_inuse_and_pinuse(ms, p, dvs);
5147  }
5148  mem = chunk2mem(p);
5149  check_malloced_chunk(ms, mem, nb);
5150  goto postaction;
5151  }
5152 
5153  else if (nb < ms->topsize) { /* Split top */
5154  size_t rsize = ms->topsize -= nb;
5155  mchunkptr p = ms->top;
5156  mchunkptr r = ms->top = chunk_plus_offset(p, nb);
5157  r->head = rsize | PINUSE_BIT;
5159  mem = chunk2mem(p);
5160  check_top_chunk(ms, ms->top);
5161  check_malloced_chunk(ms, mem, nb);
5162  goto postaction;
5163  }
5164 
5165  mem = sys_alloc(ms, nb);
5166 
5167  postaction:
5168  POSTACTION(ms);
5169  return mem;
5170  }
5171 
5172  return 0;
5173 }
mchunkptr top
Definition: mymalloc.cc:2453
#define idx2bit(i)
Definition: mymalloc.cc:2774
#define MAX_SIZE_T
Definition: mymalloc.cc:545
#define unlink_first_small_chunk(M, B, P, I)
Definition: mymalloc.cc:3454
#define small_index2size(i)
Definition: mymalloc.cc:2684
#define PINUSE_BIT
Definition: mymalloc.cc:2119
const char * p
Definition: xmltok.h:285
#define assert(x)
Definition: mymalloc.cc:1309
#define chunk_plus_offset(p, s)
Definition: mymalloc.cc:2139
#define POSTACTION(M)
Definition: mymalloc.cc:2611
#define smallbin_at(M, i)
Definition: mymalloc.cc:2688
#define chunk2mem(p)
Definition: mymalloc.cc:2091
unsigned int bindex_t
Definition: mymalloc.cc:2067
size_t head
Definition: mymalloc.cc:2059
#define left_bits(x)
Definition: mymalloc.cc:2789
#define chunksize(p)
Definition: mymalloc.cc:2134
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
unsigned int binmap_t
Definition: mymalloc.cc:2068
#define MIN_REQUEST
Definition: mymalloc.cc:2098
#define PREACTION(M)
Definition: mymalloc.cc:2607
#define compute_bit2idx(X, I)
Definition: mymalloc.cc:2824
binmap_t smallmap
Definition: mymalloc.cc:2447
struct malloc_state * mstate
Definition: mymalloc.cc:2470
struct malloc_chunk * fd
Definition: mymalloc.cc:2060
#define small_index(s)
Definition: mymalloc.cc:2683
#define check_top_chunk(M, P)
Definition: mymalloc.cc:2656
binmap_t treemap
Definition: mymalloc.cc:2448
#define set_size_and_pinuse_of_free_chunk(p, s)
Definition: mymalloc.cc:2154
#define MAX_REQUEST
Definition: mymalloc.cc:2097
#define check_malloced_chunk(M, P, N)
Definition: mymalloc.cc:2653
size_t topsize
Definition: mymalloc.cc:2450
#define SIZE_T_SIZE
Definition: mymalloc.cc:1441
size_t dvsize
Definition: mymalloc.cc:2449
#define set_size_and_pinuse_of_inuse_chunk(M, p, s)
Definition: mymalloc.cc:2921
#define ok_magic(M)
Definition: mymalloc.cc:2887
#define replace_dv(M, P, S)
Definition: mymalloc.cc:3474
mchunkptr dv
Definition: mymalloc.cc:2452
#define pad_request(req)
Definition: mymalloc.cc:2101
#define least_bit(x)
Definition: mymalloc.cc:2786
#define MIN_CHUNK_SIZE
Definition: mymalloc.cc:2087
#define MAX_SMALL_REQUEST
Definition: mymalloc.cc:2444
#define set_inuse_and_pinuse(M, p, s)
Definition: mymalloc.cc:2916
void mspace_malloc_stats ( mspace  msp)

Definition at line 5365 of file mymalloc.cc.

References python.hepunit::ms, ok_magic, and USAGE_ERROR_ACTION.

5365  {
5366  mstate ms = (mstate)msp;
5367  if (ok_magic(ms)) {
5368  internal_malloc_stats(ms);
5369  }
5370  else {
5371  USAGE_ERROR_ACTION(ms,ms);
5372  }
5373 }
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
struct malloc_state * mstate
Definition: mymalloc.cc:2470
#define ok_magic(M)
Definition: mymalloc.cc:2887
int mspace_mallopt ( int  param_number,
int  value 
)

Definition at line 5420 of file mymalloc.cc.

5420  {
5421  return change_mparam(param_number, value);
5422 }
const XML_Char int const XML_Char * value
void * mspace_memalign ( mspace  msp,
size_t  alignment,
size_t  bytes 
)

Definition at line 5320 of file mymalloc.cc.

References python.hepunit::ms, ok_magic, and USAGE_ERROR_ACTION.

5320  {
5321  mstate ms = (mstate)msp;
5322  if (!ok_magic(ms)) {
5323  USAGE_ERROR_ACTION(ms,ms);
5324  return 0;
5325  }
5326  return internal_memalign(ms, alignment, bytes);
5327 }
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
struct malloc_state * mstate
Definition: mymalloc.cc:2470
#define ok_magic(M)
Definition: mymalloc.cc:2887
void * mspace_realloc ( mspace  msp,
void mem,
size_t  newsize 
)

Definition at line 5296 of file mymalloc.cc.

References mem2chunk, python.hepunit::ms, mspace_free(), mspace_malloc(), ok_magic, and USAGE_ERROR_ACTION.

Referenced by realloc().

5296  {
5297  if (oldmem == 0)
5298  return mspace_malloc(msp, bytes);
5299 #ifdef REALLOC_ZERO_BYTES_FREES
5300  if (bytes == 0) {
5301  mspace_free(msp, oldmem);
5302  return 0;
5303  }
5304 #endif /* REALLOC_ZERO_BYTES_FREES */
5305  else {
5306 #if FOOTERS
5307  mchunkptr p = mem2chunk(oldmem);
5308  mstate ms = get_mstate_for(p);
5309 #else /* FOOTERS */
5310  mstate ms = (mstate)msp;
5311 #endif /* FOOTERS */
5312  if (!ok_magic(ms)) {
5313  USAGE_ERROR_ACTION(ms,ms);
5314  return 0;
5315  }
5316  return internal_realloc(ms, oldmem, bytes);
5317  }
5318 }
void * mspace_malloc(mspace msp, size_t bytes)
Definition: mymalloc.cc:5061
const char * p
Definition: xmltok.h:285
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
#define mem2chunk(mem)
Definition: mymalloc.cc:2092
void mspace_free(mspace msp, void *mem)
Definition: mymalloc.cc:5175
struct malloc_state * mstate
Definition: mymalloc.cc:2470
#define ok_magic(M)
Definition: mymalloc.cc:2887
int mspace_track_large_chunks ( mspace  msp,
int  enable 
)

Definition at line 5019 of file mymalloc.cc.

References disable_mmap, enable_mmap, python.hepunit::ms, POSTACTION, PREACTION, and use_mmap.

5019  {
5020  int ret = 0;
5021  mstate ms = (mstate)msp;
5022  if (!PREACTION(ms)) {
5023  if (!use_mmap(ms))
5024  ret = 1;
5025  if (!enable)
5026  enable_mmap(ms);
5027  else
5028  disable_mmap(ms);
5029  POSTACTION(ms);
5030  }
5031  return ret;
5032 }
#define use_mmap(M)
Definition: mymalloc.cc:2514
#define POSTACTION(M)
Definition: mymalloc.cc:2611
#define PREACTION(M)
Definition: mymalloc.cc:2607
#define disable_mmap(M)
Definition: mymalloc.cc:2516
#define enable_mmap(M)
Definition: mymalloc.cc:2515
struct malloc_state * mstate
Definition: mymalloc.cc:2470
int mspace_trim ( mspace  msp,
size_t  pad 
)

Definition at line 5350 of file mymalloc.cc.

References python.hepunit::ms, ok_magic, POSTACTION, PREACTION, and USAGE_ERROR_ACTION.

5350  {
5351  int result = 0;
5352  mstate ms = (mstate)msp;
5353  if (ok_magic(ms)) {
5354  if (!PREACTION(ms)) {
5355  result = sys_trim(ms, pad);
5356  POSTACTION(ms);
5357  }
5358  }
5359  else {
5360  USAGE_ERROR_ACTION(ms,ms);
5361  }
5362  return result;
5363 }
#define POSTACTION(M)
Definition: mymalloc.cc:2611
#define USAGE_ERROR_ACTION(m, p)
Definition: mymalloc.cc:2642
#define PREACTION(M)
Definition: mymalloc.cc:2607
struct malloc_state * mstate
Definition: mymalloc.cc:2470
#define ok_magic(M)
Definition: mymalloc.cc:2887
size_t mspace_usable_size ( void mem)

Definition at line 5411 of file mymalloc.cc.

References chunksize, is_inuse, mem2chunk, and overhead_for.

5411  {
5412  if (mem != 0) {
5413  mchunkptr p = mem2chunk(mem);
5414  if (is_inuse(p))
5415  return chunksize(p) - overhead_for(p);
5416  }
5417  return 0;
5418 }
const char * p
Definition: xmltok.h:285
#define chunksize(p)
Definition: mymalloc.cc:2134
#define mem2chunk(mem)
Definition: mymalloc.cc:2092
#define is_inuse(p)
Definition: mymalloc.cc:2131
#define overhead_for(p)
Definition: mymalloc.cc:2162