rustc: Stub GC routines
This commit is contained in:
parent
0fedea39ce
commit
396f6b4f59
2 changed files with 71 additions and 0 deletions
1
mk/rt.mk
1
mk/rt.mk
|
@ -25,6 +25,7 @@ RUNTIME_CS := rt/sync/timer.cpp \
|
|||
rt/rust_kernel.cpp \
|
||||
rt/rust_shape.cpp \
|
||||
rt/rust_obstack.cpp \
|
||||
rt/rust_gc.cpp \
|
||||
rt/memory_region.cpp \
|
||||
rt/test/rust_test_harness.cpp \
|
||||
rt/test/rust_test_runtime.cpp \
|
||||
|
|
70
src/rt/rust_gc.cpp
Normal file
70
src/rt/rust_gc.cpp
Normal file
|
@ -0,0 +1,70 @@
|
|||
// Rust garbage collection.
|
||||
|
||||
// TODO: Windows
|
||||
#include <utility>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "rust_internal.h"
|
||||
|
||||
#ifdef __WIN32__
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <dlfcn.h>
|
||||
#endif
|
||||
|
||||
namespace gc {
|
||||
|
||||
struct root {
|
||||
intptr_t frame_offset;
|
||||
uintptr_t dynamic; // 0 = static, 1 = dynamic
|
||||
type_desc *tydesc;
|
||||
};
|
||||
|
||||
struct safe_point {
|
||||
uintptr_t n_roots;
|
||||
root roots[0];
|
||||
};
|
||||
|
||||
class safe_point_map {
|
||||
uintptr_t n_safe_points;
|
||||
const std::pair<void *,const safe_point *> *index;
|
||||
const safe_point *safe_points;
|
||||
|
||||
public:
|
||||
safe_point_map() {
|
||||
const uintptr_t *data;
|
||||
#ifdef __WIN32__
|
||||
data = (const uintptr_t *)GetProcAddress(GetModuleHandle(NULL),
|
||||
"rust_gc_safe_points");
|
||||
#else
|
||||
data = (const uintptr_t *)dlsym(RTLD_DEFAULT, "rust_gc_safe_points");
|
||||
#endif
|
||||
n_safe_points = *data++;
|
||||
index = (const std::pair<void *,const safe_point *> *)data;
|
||||
data += n_safe_points;
|
||||
safe_points = (const safe_point *)data;
|
||||
}
|
||||
};
|
||||
|
||||
void
|
||||
gc() {
|
||||
safe_point_map map;
|
||||
|
||||
// TODO
|
||||
}
|
||||
|
||||
void
|
||||
maybe_gc() {
|
||||
// FIXME: We ought to lock this.
|
||||
static int zeal = -1;
|
||||
if (zeal == -1) {
|
||||
char *ev = getenv("RUST_GC_ZEAL");
|
||||
zeal = ev[0] != '\0' && ev[0] != '0';
|
||||
}
|
||||
|
||||
if (zeal)
|
||||
gc();
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Add table
Reference in a new issue