Rev 3297 | Rev 5270 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3297 | Rev 3391 | ||
---|---|---|---|
Line 2213... | Line 2213... | ||
2213 | #define unlink_chunk(M, P, S)\ |
2213 | #define unlink_chunk(M, P, S)\ |
2214 | if (is_small(S)) unlink_small_chunk(M, P, S)\ |
2214 | if (is_small(S)) unlink_small_chunk(M, P, S)\ |
2215 | else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } |
2215 | else { tchunkptr TP = (tchunkptr)(P); unlink_large_chunk(M, TP); } |
Line -... | Line 2216... | ||
- | 2216 | ||
Line -... | Line 2217... | ||
- | 2217 | ||
- | 2218 | /* Relays to internal calls to malloc/free from realloc, memalign etc */ |
|
- | 2219 | ||
- | 2220 | #if ONLY_MSPACES |
|
- | 2221 | #define internal_malloc(m, b) mspace_malloc(m, b) |
|
- | 2222 | #define internal_free(m, mem) mspace_free(m,mem); |
|
- | 2223 | #else /* ONLY_MSPACES */ |
|
- | 2224 | #if MSPACES |
|
- | 2225 | #define internal_malloc(m, b)\ |
|
- | 2226 | ((m == gm)? dlmalloc(b) : mspace_malloc(m, b)) |
|
- | 2227 | #define internal_free(m, mem)\ |
|
- | 2228 | if (m == gm) dlfree(mem); else mspace_free(m,mem); |
|
- | 2229 | #else /* MSPACES */ |
|
- | 2230 | #define internal_malloc(m, b) malloc(b) |
|
Line 2216... | Line 2231... | ||
2216 | 2231 | #define internal_free(m, mem) free(mem) |
|
2217 | 2232 | #endif /* MSPACES */ |
|
2218 | 2233 | #endif /* ONLY_MSPACES */ |
|
Line 2229... | Line 2244... | ||
2229 | { |
2244 | { |
2230 | return (KernelFree(ptr) != 0) ? 0 : -1; |
2245 | return (KernelFree(ptr) != 0) ? 0 : -1; |
2231 | } |
2246 | } |
Line 2232... | Line -... | ||
2232 | - | ||
2233 | 2247 | ||
2234 | 2248 | ||
2235 | #define MMAP_DEFAULT(s) os_mmap(s) |
2249 | #define MMAP_DEFAULT(s) os_mmap(s) |
Line 3088... | Line 3102... | ||
3088 | return 0; |
3102 | return 0; |
3089 | } |
3103 | } |
Line 3090... | Line 3104... | ||
3090 | 3104 | ||
Line 3091... | Line 3105... | ||
3091 | /* ---------------------------- free --------------------------- */ |
3105 | /* ---------------------------- free --------------------------- */ |
3092 | - | ||
3093 | void free(void* mem) |
3106 | |
3094 | { |
3107 | void free(void* mem){ |
3095 | /* |
3108 | /* |
3096 | Consolidate freed chunks with preceeding or succeeding bordering |
3109 | Consolidate freed chunks with preceeding or succeeding bordering |
3097 | free chunks, if they exist, and then place in a bin. Intermixed |
3110 | free chunks, if they exist, and then place in a bin. Intermixed |
Line 3204... | Line 3217... | ||
3204 | #if !FOOTERS |
3217 | #if !FOOTERS |
3205 | #undef fm |
3218 | #undef fm |
3206 | #endif /* FOOTERS */ |
3219 | #endif /* FOOTERS */ |
3207 | }>=>>><>>=>>>>>>>=><=>>><>>>>>>>>>>>>=>>=>=>>>>>><>=>>=>=><=>><>=>=>>>=><=>><>><>><>>>>>1)) |
3220 | } |
Line -... | Line 3221... | ||
- | 3221 | ||
- | 3222 | void* calloc(size_t n_elements, size_t elem_size) { |
|
- | 3223 | void* mem; |
|
- | 3224 | size_t req = 0; |
|
- | 3225 | if (n_elements != 0) { |
|
- | 3226 | req = n_elements * elem_size; |
|
- | 3227 | if (((n_elements | elem_size) & ~(size_t)0xffff) && |
|
- | 3228 | (req / n_elements != elem_size)) |
|
- | 3229 | req = MAX_SIZE_T; /* force downstream failure on overflow */ |
|
- | 3230 | } |
|
- | 3231 | mem = malloc(req); |
|
- | 3232 | if (mem != 0 && calloc_must_clear(mem2chunk(mem))) |
|
- | 3233 | memset(mem, 0, req); |
|
- | 3234 | return mem; |
|
- | 3235 | } |
|
- | 3236 | ||
- | 3237 | /* ------------ Internal support for realloc, memalign, etc -------------- */ |
|
- | 3238 | ||
- | 3239 | /* Try to realloc; only in-place unless can_move true */ |
|
- | 3240 | static mchunkptr try_realloc_chunk(mstate m, mchunkptr p, size_t nb, |
|
- | 3241 | int can_move) { |
|
- | 3242 | mchunkptr newp = 0; |
|
- | 3243 | size_t oldsize = chunksize(p); |
|
- | 3244 | mchunkptr next = chunk_plus_offset(p, oldsize); |
|
- | 3245 | if (RTCHECK(ok_address(m, p) && ok_inuse(p) && |
|
- | 3246 | ok_next(p, next) && ok_pinuse(next))) { |
|
- | 3247 | if (is_mmapped(p)) { |
|
- | 3248 | newp = mmap_resize(m, p, nb, can_move); |
|
- | 3249 | } |
|
- | 3250 | else if (oldsize >= nb) { /* already big enough */ |
|
- | 3251 | size_t rsize = oldsize - nb; |
|
- | 3252 | if (rsize >= MIN_CHUNK_SIZE) { /* split off remainder */ |
|
- | 3253 | mchunkptr r = chunk_plus_offset(p, nb); |
|
- | 3254 | set_inuse(m, p, nb); |
|
- | 3255 | set_inuse(m, r, rsize); |
|
- | 3256 | dispose_chunk(m, r, rsize); |
|
- | 3257 | } |
|
- | 3258 | newp = p; |
|
- | 3259 | } |
|
- | 3260 | else if (next == m->top) { /* extend into top */ |
|
- | 3261 | if (oldsize + m->topsize > nb) { |
|
- | 3262 | size_t newsize = oldsize + m->topsize; |
|
- | 3263 | size_t newtopsize = newsize - nb; |
|
- | 3264 | mchunkptr newtop = chunk_plus_offset(p, nb); |
|
- | 3265 | set_inuse(m, p, nb); |
|
- | 3266 | newtop->head = newtopsize |PINUSE_BIT; |
|
- | 3267 | m->top = newtop; |
|
- | 3268 | m->topsize = newtopsize; |
|
- | 3269 | newp = p; |
|
- | 3270 | } |
|
- | 3271 | } |
|
- | 3272 | else if (next == m->dv) { /* extend into dv */ |
|
- | 3273 | size_t dvs = m->dvsize; |
|
- | 3274 | if (oldsize + dvs >= nb) { |
|
- | 3275 | size_t dsize = oldsize + dvs - nb; |
|
- | 3276 | if (dsize >= MIN_CHUNK_SIZE) { |
|
- | 3277 | mchunkptr r = chunk_plus_offset(p, nb); |
|
- | 3278 | mchunkptr n = chunk_plus_offset(r, dsize); |
|
- | 3279 | set_inuse(m, p, nb); |
|
- | 3280 | set_size_and_pinuse_of_free_chunk(r, dsize); |
|
- | 3281 | clear_pinuse(n); |
|
- | 3282 | m->dvsize = dsize; |
|
- | 3283 | m->dv = r; |
|
- | 3284 | } |
|
- | 3285 | else { /* exhaust dv */ |
|
- | 3286 | size_t newsize = oldsize + dvs; |
|
- | 3287 | set_inuse(m, p, newsize); |
|
- | 3288 | m->dvsize = 0; |
|
- | 3289 | m->dv = 0; |
|
- | 3290 | } |
|
- | 3291 | newp = p; |
|
- | 3292 | } |
|
- | 3293 | } |
|
- | 3294 | else if (!cinuse(next)) { /* extend into next free chunk */ |
|
- | 3295 | size_t nextsize = chunksize(next); |
|
- | 3296 | if (oldsize + nextsize >= nb) { |
|
- | 3297 | size_t rsize = oldsize + nextsize - nb; |
|
- | 3298 | unlink_chunk(m, next, nextsize); |
|
- | 3299 | if (rsize < MIN_CHUNK_SIZE) { |
|
- | 3300 | size_t newsize = oldsize + nextsize; |
|
- | 3301 | set_inuse(m, p, newsize); |
|
- | 3302 | } |
|
- | 3303 | else { |
|
- | 3304 | mchunkptr r = chunk_plus_offset(p, nb); |
|
- | 3305 | set_inuse(m, p, nb); |
|
- | 3306 | set_inuse(m, r, rsize); |
|
- | 3307 | dispose_chunk(m, r, rsize); |
|
- | 3308 | } |
|
- | 3309 | newp = p; |
|
- | 3310 | } |
|
- | 3311 | } |
|
- | 3312 | } |
|
- | 3313 | else { |
|
- | 3314 | USAGE_ERROR_ACTION(m, chunk2mem(p)); |
|
- | 3315 | } |
|
- | 3316 | return newp; |
|
- | 3317 | } |
|
- | 3318 | ||
- | 3319 | ||
- | 3320 | void* realloc(void* oldmem, size_t bytes) { |
|
- | 3321 | void* mem = 0; |
|
- | 3322 | if (oldmem == 0) { |
|
- | 3323 | mem = malloc(bytes); |
|
- | 3324 | } |
|
- | 3325 | else if (bytes >= MAX_REQUEST) { |
|
- | 3326 | // MALLOC_FAILURE_ACTION; |
|
- | 3327 | } |
|
- | 3328 | #ifdef REALLOC_ZERO_BYTES_FREES |
|
- | 3329 | else if (bytes == 0) { |
|
- | 3330 | free(oldmem); |
|
- | 3331 | } |
|
- | 3332 | #endif /* REALLOC_ZERO_BYTES_FREES */ |
|
- | 3333 | else { |
|
- | 3334 | size_t nb = request2size(bytes); |
|
- | 3335 | mchunkptr oldp = mem2chunk(oldmem); |
|
- | 3336 | #if ! FOOTERS |
|
- | 3337 | mstate m = gm; |
|
- | 3338 | #else /* FOOTERS */ |
|
- | 3339 | mstate m = get_mstate_for(oldp); |
|
- | 3340 | if (!ok_magic(m)) { |
|
- | 3341 | USAGE_ERROR_ACTION(m, oldmem); |
|
- | 3342 | return 0; |
|
- | 3343 | } |
|
- | 3344 | #endif /* FOOTERS */ |
|
- | 3345 | PREACTION(m); { |
|
- | 3346 | mchunkptr newp = try_realloc_chunk(m, oldp, nb, 1); |
|
- | 3347 | POSTACTION(m); |
|
- | 3348 | if (newp != 0) { |
|
- | 3349 | check_inuse_chunk(m, newp); |
|
- | 3350 | mem = chunk2mem(newp); |
|
- | 3351 | } |
|
- | 3352 | else { |
|
- | 3353 | mem = internal_malloc(m, bytes); |
|
- | 3354 | if (mem != 0) { |
|
- | 3355 | size_t oc = chunksize(oldp) - overhead_for(oldp); |
|
- | 3356 | memcpy(mem, oldmem, (oc < bytes)? oc : bytes); |
|
- | 3357 | internal_free(m, oldmem); |
|
- | 3358 | } |
|
- | 3359 | } |
|
- | 3360 | } |
|
- | 3361 | } |
|
- | 3362 | return mem; |
|
- | 3363 | }>>>=>>><>>=>>>>>>>=><=>>><>>>>>>>>>>>>=>>=>=>>>>>><>=>>=>=><=>><>=>=>>>=><=>><>><>><>>>>>1)) |
|
- | 3364 | ||
- | 3365 | /*><1)) |