region_addr_t min;
region_addr_t max;
struct region_el *allocated;
+ struct region_el *last;
};
region_t region_create(region_addr_t min, region_addr_t max)
memset(region, 0, sizeof(struct region_struct));
region->min = min;
region->max = max;
+ region->last = NULL;
return region;
}
if (n == 0)
return 1;
+ if (region->last && region->last->end == start &&
+ !region->last->next) {
+ region->last->end = end;
+ return 0;
+ }
+ if (region->last && start > region->last->end &&
+ !region->last->next) {
+ r = NULL;
+ prev = region->last;
+ goto append_to_list;
+ }
+
/*
* Search through the linked list. If we find that it
* conflicts witih something that's already allocated, return
r->end = next->end;
r->next = next->next;
free(next);
+ if (!r->next)
+ region->last = r;
return 0;
}
}
/*
* Insert a new region element structure into the linked list
*/
+append_to_list:
new_region = malloc(sizeof(struct region_el));
if (!new_region)
return -1;
new_region->start = start;
new_region->end = start + n;
new_region->next = r;
+ if (!new_region->next)
+ region->last = new_region;
if (prev)
prev->next = new_region;
else
struct region_el *r;
int i = 0;
- fprintf(f, "Printing region (min=%d. max=%d)\n\t", region->min,
+ fprintf(f, "Printing region (min=%llu. max=%llu)\n\t", region->min,
region->max);
for (r = region->allocated; r; r = r->next) {
- fprintf(f, "(%d, %d) ", r->start, r->end);
+ fprintf(f, "(%llu, %llu) ", r->start, r->end);
if (++i >= 8)
fprintf(f, "\n\t");
}
case BCODE_CREATE:
start = bcode_program[pc++];
end = bcode_program[pc++];
- printf("Creating region with args(%d, %d)\n",
+ printf("Creating region with args(%llu, %llu)\n",
start, end);
r = region_create(start, end);
if (!r) {
start = bcode_program[pc++];
end = bcode_program[pc++];
ret = region_allocate(r, start, end);
- printf("Region_allocate(%d, %d) returns %d\n",
+ printf("Region_allocate(%llu, %llu) returns %d\n",
start, end, ret);
break;
case BCODE_PRINT: