diff --git a/src/rt/rust_task.h b/src/rt/rust_task.h index 5513cd9e282..05c34cec587 100644 --- a/src/rt/rust_task.h +++ b/src/rt/rust_task.h @@ -5,6 +5,8 @@ #ifndef RUST_TASK_H #define RUST_TASK_H +#include + #include "util/array_list.h" #include "context.h" @@ -113,6 +115,8 @@ rust_task : public kernel_owned, rust_cond rust_obstack dynastack; + std::map local_allocs; + // Only a pointer to 'name' is kept, so it must live as long as this task. rust_task(rust_scheduler *sched, rust_task_list *state, diff --git a/src/rt/rust_upcall.cpp b/src/rt/rust_upcall.cpp index 79291bdd3a3..5fabb5cd1ab 100644 --- a/src/rt/rust_upcall.cpp +++ b/src/rt/rust_upcall.cpp @@ -67,6 +67,8 @@ upcall_malloc(rust_task *task, size_t nbytes, type_desc *td) { void *p = task->malloc(nbytes, "tdesc", td); + task->local_allocs[p] = td; + LOG(task, mem, "upcall malloc(%" PRIdPTR ", 0x%" PRIxPTR ") = 0x%" PRIxPTR, nbytes, td, (uintptr_t)p); @@ -84,6 +86,8 @@ upcall_free(rust_task *task, void* ptr, uintptr_t is_gc) { DLOG(sched, mem, "upcall free(0x%" PRIxPTR ", is_gc=%" PRIdPTR ")", (uintptr_t)ptr, is_gc); + + task->local_allocs.erase(ptr); task->free(ptr, (bool) is_gc); }