Subversion Repositories Kolibri OS

Rev

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
}
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
}
-
 
3364
 
-
 
3365
/*>