aboutsummaryrefslogtreecommitdiff
path: root/v_windows/v/old/vlib/builtin/builtin_d_gcboehm.v
diff options
context:
space:
mode:
Diffstat (limited to 'v_windows/v/old/vlib/builtin/builtin_d_gcboehm.v')
-rw-r--r--v_windows/v/old/vlib/builtin/builtin_d_gcboehm.v91
1 files changed, 91 insertions, 0 deletions
diff --git a/v_windows/v/old/vlib/builtin/builtin_d_gcboehm.v b/v_windows/v/old/vlib/builtin/builtin_d_gcboehm.v
new file mode 100644
index 0000000..befec1d
--- /dev/null
+++ b/v_windows/v/old/vlib/builtin/builtin_d_gcboehm.v
@@ -0,0 +1,91 @@
+module builtin
+
+#flag -DGC_THREADS=1
+
+$if static_boehm ? {
+ $if macos {
+ #flag -I$first_existing("/opt/homebrew/include", "/usr/local/include")
+ #flag $first_existing("/opt/homebrew/lib/libgc.a", "/usr/local/lib/libgc.a")
+ } $else $if linux {
+ #flag -l:libgc.a
+ } $else $if openbsd {
+ #flag -I/usr/local/include
+ #flag /usr/local/lib/libgc.a
+ #flag -lpthread
+ } $else $if windows {
+ #flag -DGC_NOT_DLL=1
+ $if tinyc {
+ #flag -I@VEXEROOT/thirdparty/libgc/include
+ #flag -L@VEXEROOT/thirdparty/libgc
+ #flag -lgc
+ } $else {
+ #flag -DGC_BUILTIN_ATOMIC=1
+ #flag -I@VEXEROOT/thirdparty/libgc
+ #flag @VEXEROOT/thirdparty/libgc/gc.o
+ }
+ } $else {
+ #flag -lgc
+ }
+} $else {
+ $if macos {
+ #pkgconfig bdw-gc
+ } $else $if openbsd || freebsd {
+ #flag -I/usr/local/include
+ #flag -L/usr/local/lib
+ }
+ $if windows {
+ $if tinyc {
+ #flag -I@VEXEROOT/thirdparty/libgc/include
+ #flag -L@VEXEROOT/thirdparty/libgc
+ #flag -lgc
+ } $else {
+ #flag -DGC_BUILTIN_ATOMIC=1
+ #flag -I@VEXEROOT/thirdparty/libgc
+ #flag @VEXEROOT/thirdparty/libgc/gc.o
+ }
+ } $else {
+ #flag -lgc
+ }
+}
+
+$if gcboehm_leak ? {
+ #flag -DGC_DEBUG=1
+}
+
+#include <gc.h>
+
+// replacements for `malloc()/calloc()`, `realloc()` and `free()`
+// for use with Boehm-GC
+// Do not use them manually. They are automatically chosen when
+// compiled with `-gc boehm` or `-gc boehm_leak`.
+fn C.GC_MALLOC(n size_t) voidptr
+
+fn C.GC_MALLOC_ATOMIC(n size_t) voidptr
+
+fn C.GC_MALLOC_UNCOLLECTABLE(n size_t) voidptr
+
+fn C.GC_REALLOC(ptr voidptr, n size_t) voidptr
+
+fn C.GC_FREE(ptr voidptr)
+
+// explicitely perform garbage collection now! Garbage collections
+// are done automatically when needed, so this function is hardly needed
+fn C.GC_gcollect()
+
+// functions to temporarily suspend/resume garbage collection
+fn C.GC_disable()
+
+fn C.GC_enable()
+
+// returns non-zero if GC is disabled
+fn C.GC_is_disabled() int
+
+// protect memory block from being freed before this call
+fn C.GC_reachable_here(voidptr)
+
+// for leak detection it is advisable to do explicit garbage collections
+pub fn gc_check_leaks() {
+ $if gcboehm_leak ? {
+ C.GC_gcollect()
+ }
+}