| 404 | } |
| 405 | |
| 406 | void *calloc(size_t nelem, size_t elsize) { |
| 407 | struct call *c; |
| 408 | struct memblock *b; |
| 409 | int size; |
| 410 | struct thread_info *ti; |
| 411 | |
| 412 | init(); |
| 413 | if (in_init) |
| 414 | return dl_calloc(nelem, elsize); |
| 415 | |
| 416 | ti = get_thread_info(); |
| 417 | |
| 418 | size = nelem * elsize; |
| 419 | b = dl_malloc(offsetof(struct memblock, mem) + size); |
| 420 | b->flags = 0; |
| 421 | b->blocksize = size; |
| 422 | LOCK(&lk) { |
| 423 | c = get_call(); |
| 424 | b->ti = ti; |
| 425 | b->place_allocated = c; |
| 426 | c->total_allocated += size; |
| 427 | listc_abl(&c->blocks, b); |
| 428 | listc_abl(&blocks, b); |
| 429 | listc_abl(&ti->blocks, b); |
| 430 | } UNLOCK(&lk); |
| 431 | bzero(b->mem, size); |
| 432 | return b->mem; |
| 433 | } |
| 434 | |
| 435 | void free(void *ptr) { |
| 436 | struct call *c; |