1 #include <portability.h>
48 size +=
sizeof(size_t);
51 p =
static_cast<char *
>(malloc (size));
54 SNPRINTF(msg,
BUFFER_MSG_SIZE,
"\nmem.c: Error: Tried but failed to allocate %llu bytes of memory.\n", static_cast<long long unsigned>(size));
58 if (reinterpret_cast<uintptr_t>(p) & 3) {
60 strncpy (msg,
"\nmem.c: Error: Memory allocator returned an address that's not a multiple of 4.\n",
BUFFER_MSG_SIZE);
67 *(
reinterpret_cast<size_t *
>(p)) = size;
84 if ( mem == 0 )
return;
86 mem =
static_cast<char *
>(mem) -
sizeof(
size_t);
87 size = *(
static_cast<size_t *
>(mem));
103 print (thisAgent,
"%8lu bytes total memory allocated\n", total);
104 print(thisAgent,
"%8lu bytes statistics overhead\n",
106 print(thisAgent,
"%8lu bytes for strings\n",
108 print(thisAgent,
"%8lu bytes for hash tables\n",
110 print(thisAgent,
"%8lu bytes for various memory pools\n",
112 print(thisAgent,
"%8lu bytes for miscellaneous other things\n",
157 #define INITIAL_GROWABLE_STRING_SIZE 100
171 const char *string_to_add) {
172 size_t current_length, length_to_add, new_length, new_memsize;
176 length_to_add = strlen (string_to_add);
177 new_length = current_length + length_to_add;
180 while (new_length + 1 > new_memsize) new_memsize = new_memsize * 2;
218 #define DEFAULT_INTERLEAVE_FACTOR 1
222 #define DEFAULT_BLOCK_SIZE 0x7FF0
226 size_t size, i, item_num, interleave_factor;
227 char *item, *prev_item;
232 *(
char * *)new_block = static_cast<char *>(p->
first_block);
260 item_num = interleave_factor;
261 prev_item = new_block +
sizeof(
char *);
263 item = new_block +
sizeof(
char *) + item_num * p->
item_size;
264 *(
char * *)prev_item = item;
266 item_num = item_num + interleave_factor;
269 *(
char * *)prev_item = static_cast<char *>(p->
free_list);
270 p->
free_list = new_block +
sizeof(
char *);
276 char *cur_block =
static_cast<char*
>(p->
first_block);
280 next_block = *(
char **)cur_block;
282 cur_block = next_block;
288 if (item_size <
sizeof(
char *)) item_size =
sizeof(
char *);
289 while (item_size & 3) item_size++;
295 #ifdef MEMORY_POOL_STATS
302 SNPRINTF(msg, 2*
MAX_POOL_NAME_LENGTH,
"mem.c: Internal error: memory pool name too long: %s\n",name);
341 cons *prev, *current, *next;
346 next = current->
rest;
347 current->
rest = prev;
356 if (the_list->
first == item)
return TRUE;
357 the_list = the_list->
rest;
365 for (c=old_list; c!=
NIL; c=c->
rest)
366 if (c->
first==item)
return old_list;
378 the_list = the_list->
rest;
385 cons *first_extracted_element, *tail_of_extracted_elements;
386 cons *c, *prev_c, *next_c;
388 first_extracted_element =
NIL;
389 tail_of_extracted_elements =
NIL;
392 for (c=(*header); c!=
NIL; c=next_c)
395 if (!f(thisAgent, c, data))
402 prev_c->
rest = next_c;
405 if (first_extracted_element)
406 tail_of_extracted_elements->
rest = c;
408 first_extracted_element = c;
410 tail_of_extracted_elements = c;
413 if (first_extracted_element)
414 tail_of_extracted_elements->
rest =
NIL;
416 return first_extracted_element;
421 dl_cons *first_extracted_element, *tail_of_extracted_elements;
424 first_extracted_element =
NIL;
425 tail_of_extracted_elements =
NIL;
427 for (dc=(*header); dc!=
NIL; dc=next_dc)
431 if (!f(dc,thisAgent))
436 if (first_extracted_element)
437 tail_of_extracted_elements->
next = dc;
439 first_extracted_element = dc;
441 dc->
prev = tail_of_extracted_elements;
442 tail_of_extracted_elements = dc;
447 if (first_extracted_element)
448 tail_of_extracted_elements->
next =
NIL;
450 return first_extracted_element;
455 return (c->
first == data);
493 0x00000001, 0x00000003, 0x00000007, 0x0000000F,
494 0x0000001F, 0x0000003F, 0x0000007F, 0x000000FF,
495 0x000001FF, 0x000003FF, 0x000007FF, 0x00000FFF,
496 0x00001FFF, 0x00003FFF, 0x00007FFF, 0x0000FFFF,
497 0x0001FFFF, 0x0003FFFF, 0x0007FFFF, 0x000FFFFF,
498 0x001FFFFF, 0x003FFFFF, 0x007FFFFF, 0x00FFFFFF,
499 0x01FFFFFF, 0x03FFFFFF, 0x07FFFFFF, 0x0FFFFFFF,
500 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF, 0xFFFFFFFF };
509 if (minimum_log2size < 1) minimum_log2size = 1;
510 ht->
size =
static_cast<uint32_t>(1) << minimum_log2size;
526 new_size =
static_cast<uint32_t>(1) << new_log2size;
531 for (i=0; i < ht->
size; i++) {
532 for (item = *(ht->
buckets + i); item!=
NIL; item=next) {
535 hash_value = (*(ht->
h))(item,new_log2size);
536 item->
next = *(new_buckets+hash_value);
537 *(new_buckets+hash_value) = item;
559 hash_value = (*(ht->
h))(item, ht->
log2size);
560 if (*(ht->
buckets+hash_value)==this_one) {
565 prev = *(ht->
buckets+hash_value);
566 while (prev && prev->
next != this_one) prev=prev->
next;
569 assert(prev &&
"Couldn't find item to remove from hash table!");
590 hash_value = (*(ht->
h))(item, ht->
log2size);
592 *(ht->
buckets+hash_value) = this_one;
603 for (hash_value=0; hash_value < ht->
size; hash_value++) {
605 for ( ; item!=
NIL; item = item->
next)
606 if ((*f)(thisAgent, item, userdata))
return;
617 for ( ; item!=
NIL; item = item->
next)
618 if ((*f)(item))
return;