123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- #include "malloc.h"
- void* calloc(size_t n_elements, size_t elem_size)
- {
- mchunkptr p;
- unsigned long clearsize;
- unsigned long nclears;
- size_t size, *d;
- void* mem;
-
- size = n_elements * elem_size;
- if (n_elements && elem_size != (size / n_elements)) {
- __set_errno(ENOMEM);
- return NULL;
- }
- LOCK;
- mem = malloc(size);
- if (mem != 0) {
- p = mem2chunk(mem);
- if (!chunk_is_mmapped(p))
- {
-
- d = (size_t*)mem;
- clearsize = chunksize(p) - (sizeof(size_t));
- nclears = clearsize / sizeof(size_t);
- assert(nclears >= 3);
- if (nclears > 9)
- memset(d, 0, clearsize);
- else {
- *(d+0) = 0;
- *(d+1) = 0;
- *(d+2) = 0;
- if (nclears > 4) {
- *(d+3) = 0;
- *(d+4) = 0;
- if (nclears > 6) {
- *(d+5) = 0;
- *(d+6) = 0;
- if (nclears > 8) {
- *(d+7) = 0;
- *(d+8) = 0;
- }
- }
- }
- }
- }
- #if 0
- else
- {
-
- d = (size_t*)mem;
-
- clearsize = chunksize(p) - 2*(sizeof(size_t));
- memset(d, 0, clearsize);
- }
- #endif
- }
- UNLOCK;
- return mem;
- }
|