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);
178 static size_t sz2i(
size_t);
180 static size_t i2sz(
size_t);
194 void reuse(
void*
p,
size_t s);
204 SharedMemory::operator
new(
size_t s) {
208 SharedMemory::operator
delete(
void*
p) {
221 while (heap.hc != NULL) {
242 return --use_cnt == 0;
250 p =
ptr_cast<
char*>(®ion.area[0]) + region.free;
255 while ((heap.hc != NULL) && (heap.hc->size < l)) {
261 if (heap.hc == NULL) {
262 assert(heap.n_hc == 0);
279 hc->
next = heap.hc; heap.hc =
hc;
312 MemoryManager::sz2i(
size_t s) {
319 MemoryManager::i2sz(
size_t i) {
348 return &cur_hc->
area[0];
352 MemoryManager::alloc_fill(
SharedMemory* sm,
size_t sz,
bool first) {
361 size_t overhead =
sizeof(HeapChunk) -
sizeof(
double);
364 size_t allocate = ((sz > cur_hcsz) ?
365 (((
size_t) (sz / cur_hcsz)) + 1) * cur_hcsz : cur_hcsz);
368 start =
ptr_cast<
char*>(&hc->area[0]);
369 lsz = hc->size - overhead;
372 requested = hc->size;
373 hc->next = NULL; cur_hc = hc;
375 requested += hc->size;
376 hc->next = cur_hc->
next; cur_hc->
next = hc;
378 #ifdef GECODE_MEMORY_CHECK
379 for (
char*
c = start;
c < (start+lsz);
c++)
386 : cur_hcsz(MemoryConfig::
hcsz_min), requested(0), slack(NULL) {
387 alloc_fill(sm,cur_hcsz,
true);
396 : cur_hcsz(mm.cur_hcsz), requested(0), slack(NULL) {
400 (s_sub*2 < cur_hcsz))
402 alloc_fill(sm,cur_hcsz+s_sub,
true);
418 }
while (hc != NULL);
429 #ifdef GECODE_MEMORY_CHECK
431 char*
c =
static_cast<char*
>(
p);
448 f->
next(fl[i]); fl[
i]=f;
464 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));