Malloc using mmap */
| 3203 | |
| 3204 | /* Malloc using mmap */ |
| 3205 | static void* mmap_alloc(mstate m, size_t nb) { |
| 3206 | size_t mmsize = granularity_align(nb + SIX_SIZE_T_SIZES + CHUNK_ALIGN_MASK); |
| 3207 | if (mmsize > nb) { /* Check for wrap around 0 */ |
| 3208 | char* mm = (char*)(DIRECT_MMAP(mmsize)); |
| 3209 | if (mm != CMFAIL) { |
| 3210 | size_t offset = align_offset(chunk2mem(mm)); |
| 3211 | size_t psize = mmsize - offset - MMAP_FOOT_PAD; |
| 3212 | mchunkptr p = (mchunkptr)(mm + offset); |
| 3213 | p->prev_foot = offset | IS_MMAPPED_BIT; |
| 3214 | (p)->head = (psize|CINUSE_BIT); |
| 3215 | mark_inuse_foot(m, p, psize); |
| 3216 | chunk_plus_offset(p, psize)->head = FENCEPOST_HEAD; |
| 3217 | chunk_plus_offset(p, psize+SIZE_T_SIZE)->head = 0; |
| 3218 | |
| 3219 | if (mm < m->least_addr) |
| 3220 | m->least_addr = mm; |
| 3221 | if ((m->footprint += mmsize) > m->max_footprint) |
| 3222 | m->max_footprint = m->footprint; |
| 3223 | assert(is_aligned(chunk2mem(p))); |
| 3224 | check_mmapped_chunk(m, p); |
| 3225 | return chunk2mem(p); |
| 3226 | } |
| 3227 | } |
| 3228 | return 0; |
| 3229 | } |
| 3230 | |
| 3231 | /* Realloc using mmap */ |
| 3232 | static mchunkptr mmap_resize(mstate m, mchunkptr oldp, size_t nb) { |