109 static void*
operator new(
size_t s);
111 static void operator delete(
void*
p);
162 void alloc_fill(
SharedMemory* sm,
size_t s,
bool first);
176 static size_t sz2i(
size_t);
178 static size_t i2sz(
size_t);
192 void reuse(
void*
p,
size_t s);
202 SharedMemory::operator
new(
size_t s) {
206 SharedMemory::operator
delete(
void*
p) {
219 while (heap.hc != NULL) {
240 return --use_cnt == 0;
248 p =
ptr_cast<
char*>(®ion.area[0]) + region.free;
253 while ((heap.hc != NULL) && (heap.hc->size < l)) {
259 if (heap.hc == NULL) {
260 assert(heap.n_hc == 0);
277 hc->
next = heap.hc; heap.hc =
hc;
310 MemoryManager::sz2i(
size_t s) {
317 MemoryManager::i2sz(
size_t i) {
341 return &cur_hc->
area[0];
345 MemoryManager::alloc_fill(
SharedMemory* sm,
size_t sz,
bool first) {
354 size_t overhead =
sizeof(HeapChunk) -
sizeof(
double);
357 size_t allocate = ((sz > cur_hcsz) ?
358 (((
size_t) (sz / cur_hcsz)) + 1) * cur_hcsz : cur_hcsz);
361 start =
ptr_cast<
char*>(&hc->area[0]);
362 lsz = hc->size - overhead;
365 requested = hc->size;
366 hc->next = NULL; cur_hc = hc;
368 requested += hc->size;
369 hc->next = cur_hc->
next; cur_hc->
next = hc;
371 #ifdef GECODE_MEMORY_CHECK
372 for (
char*
c = start;
c < (start+lsz);
c++)
379 : cur_hcsz(MemoryConfig::
hcsz_min), requested(0), slack(NULL) {
380 alloc_fill(sm,cur_hcsz,
true);
389 : cur_hcsz(mm.cur_hcsz), requested(0), slack(NULL) {
393 (s_sub*2 < cur_hcsz))
395 alloc_fill(sm,cur_hcsz+s_sub,
true);
411 }
while (hc != NULL);
422 #ifdef GECODE_MEMORY_CHECK
424 char*
c =
static_cast<char*
>(
p);
441 f->
next(fl[i]); fl[
i]=f;
457 fl_refill<s>(sm); f = fl[
i];
475 l->
next(fl[i]); fl[
i] = f;
496 ptr_cast<FreeList*>(block)->next(NULL);
500 fl[sz2i(sz)] =
ptr_cast<FreeList*>(block);
503 ptr_cast<FreeList*>(block+i*sz)->next(ptr_cast<FreeList*>(block+(i+1)*sz));
507 (ptr_cast<FreeList*>(NULL));