Lots of work on memory tracking and channels.

We're trying to get closer to doing correct move semantics for channel
operations. This involves a lot of cleanup (such as removing the
unused sched parameter from rust_vec constructor) and making
circular_buffer kernel_owned.

Added tagging for memory allocations. This means we give a string tag
to everything we allocate. If we leak something and TRACK_ALLOCATIONS
is enabled, then it's much easier now to tell exactly what is leaking.
This commit is contained in:
Eric Holk
2011-07-18 12:02:26 -07:00
committed by Brian Anderson
parent a44fb04d57
commit 3ae4dcd41e
24 changed files with 313 additions and 240 deletions

View File

@@ -9,7 +9,6 @@
extern "C" CDECL rust_str*
last_os_error(rust_task *task) {
rust_scheduler *sched = task->sched;
LOG(task, task, "last_os_error()");
#if defined(__WIN32__)
@@ -42,12 +41,12 @@ last_os_error(rust_task *task) {
#endif
size_t fill = strlen(buf) + 1;
size_t alloc = next_power_of_two(sizeof(rust_str) + fill);
void *mem = task->malloc(alloc);
void *mem = task->malloc(alloc, "rust_str(last_os_error)");
if (!mem) {
task->fail();
return NULL;
}
rust_str *st = new (mem) rust_str(sched, alloc, fill,
rust_str *st = new (mem) rust_str(alloc, fill,
(const uint8_t *)buf);
#ifdef __WIN32__
@@ -58,7 +57,6 @@ last_os_error(rust_task *task) {
extern "C" CDECL rust_str *
rust_getcwd(rust_task *task) {
rust_scheduler *sched = task->sched;
LOG(task, task, "rust_getcwd()");
char cbuf[BUF_BYTES];
@@ -74,14 +72,14 @@ rust_getcwd(rust_task *task) {
size_t fill = strlen(cbuf) + 1;
size_t alloc = next_power_of_two(sizeof(rust_str) + fill);
void *mem = task->malloc(alloc);
void *mem = task->malloc(alloc, "rust_str(getcwd)");
if (!mem) {
task->fail();
return NULL;
}
rust_str *st;
st = new (mem) rust_str(sched, alloc, fill, (const uint8_t *)cbuf);
st = new (mem) rust_str(alloc, fill, (const uint8_t *)cbuf);
return st;
}
@@ -125,17 +123,16 @@ unsupervise(rust_task *task) {
extern "C" CDECL rust_vec*
vec_alloc(rust_task *task, type_desc *t, type_desc *elem_t, size_t n_elts)
{
rust_scheduler *sched = task->sched;
LOG(task, mem, "vec_alloc %" PRIdPTR " elements of size %" PRIdPTR,
n_elts, elem_t->size);
size_t fill = n_elts * elem_t->size;
size_t alloc = next_power_of_two(sizeof(rust_vec) + fill);
void *mem = task->malloc(alloc, t->is_stateful ? t : NULL);
void *mem = task->malloc(alloc, "rust_vec", t->is_stateful ? t : NULL);
if (!mem) {
task->fail();
return NULL;
}
rust_vec *vec = new (mem) rust_vec(sched, alloc, 0, NULL);
rust_vec *vec = new (mem) rust_vec(alloc, 0, NULL);
return vec;
}
@@ -199,11 +196,10 @@ vec_alloc_with_data(rust_task *task,
size_t elt_size,
void *d)
{
rust_scheduler *sched = task->sched;
size_t alloc = next_power_of_two(sizeof(rust_vec) + (n_elts * elt_size));
void *mem = task->malloc(alloc);
void *mem = task->malloc(alloc, "rust_vec (with data)");
if (!mem) return NULL;
return new (mem) rust_vec(sched, alloc, fill * elt_size, (uint8_t*)d);
return new (mem) rust_vec(alloc, fill * elt_size, (uint8_t*)d);
}
extern "C" CDECL rust_vec*
@@ -377,7 +373,7 @@ extern "C" CDECL void *
rand_new(rust_task *task)
{
rust_scheduler *sched = task->sched;
randctx *rctx = (randctx *) task->malloc(sizeof(randctx));
randctx *rctx = (randctx *) task->malloc(sizeof(randctx), "randctx");
if (!rctx) {
task->fail();
return NULL;
@@ -619,8 +615,9 @@ rust_list_files_ivec(rust_task *task, rust_str *path) {
sizeof(size_t) // fill
+ sizeof(size_t) // alloc
+ sizeof(rust_str *) * 4; // payload
rust_box *box = (rust_box *)task->malloc(sizeof(rust_box) +
str_ivec_sz);
rust_box *box = (rust_box *)task->malloc(sizeof(rust_box) + str_ivec_sz,
"rust_box(list_files_ivec)");
box->ref_count = 1;
rust_ivec *iv = (rust_ivec *)&box->data;
iv->fill = 0;
@@ -628,7 +625,7 @@ rust_list_files_ivec(rust_task *task, rust_str *path) {
size_t alloc_sz = sizeof(rust_str *) * strings.size();
iv->alloc = alloc_sz;
iv->payload.ptr = (rust_ivec_heap *)
task->kernel->malloc(alloc_sz + sizeof(size_t));
task->kernel->malloc(alloc_sz + sizeof(size_t), "files ivec");
iv->payload.ptr->fill = alloc_sz;
memcpy(&iv->payload.ptr->data, strings.data(), alloc_sz);
return box;
@@ -706,7 +703,8 @@ ivec_reserve(rust_task *task, type_desc *ty, rust_ivec *v, size_t n_elems)
if (v->fill || !v->payload.ptr) {
// On stack; spill to heap.
heap_part = (rust_ivec_heap *)task->malloc(new_alloc +
sizeof(size_t));
sizeof(size_t),
"ivec reserve heap part");
heap_part->fill = v->fill;
memcpy(&heap_part->data, v->payload.data, v->fill);
@@ -737,8 +735,9 @@ ivec_reserve_shared(rust_task *task, type_desc *ty, rust_ivec *v,
rust_ivec_heap *heap_part;
if (v->fill || !v->payload.ptr) {
// On stack; spill to heap.
heap_part = (rust_ivec_heap *)task->kernel->malloc(new_alloc +
sizeof(size_t));
heap_part = (rust_ivec_heap *)
task->kernel->malloc(new_alloc + sizeof(size_t),
"ivec reserve shared");
heap_part->fill = v->fill;
memcpy(&heap_part->data, v->payload.data, v->fill);