4
#include <emscripten.h>
10
void finalizer(void *ptr, void *arg) {
11
printf("finalizing %d (global == %d)\n", (int)arg, ptr == global);
13
if (ptr == global) global = 0;
20
if (stage == 0) { // wait for a while, see no GCing
22
if (emscripten_get_now() - start > 2100) {
23
GC_MALLOC(1024*1024*2); // allocate enough to trigger a GC
24
start = emscripten_get_now();
28
} else if (stage == 1) {
33
start = emscripten_get_now();
36
if (emscripten_get_now() - start > 2100) {
37
printf("fail, too much time passed (a)\n");
40
} else if (stage == 2) {
41
if (emscripten_get_now() - start > 2100) { // wait and see that no gc'ing happens yet
42
GC_MALLOC(1024*1024*2); // allocate enough to trigger a GC
44
start = emscripten_get_now();
47
} else if (stage == 3) {
55
if (emscripten_get_now() - start > 2100) {
56
printf("fail, too much time passed (b)\n");
61
emscripten_async_call(waiter, NULL, 100);
65
start = emscripten_get_now();
69
void *local, *local2, *local3, *local4;
71
global = GC_MALLOC(12);
72
GC_REGISTER_FINALIZER_NO_ORDER(global, finalizer, 0, 0, 0);
73
local = GC_MALLOC(12);
74
GC_REGISTER_FINALIZER_NO_ORDER(local, finalizer, (void*)1, 0, 0);
75
local2 = GC_MALLOC_ATOMIC(12);
76
GC_REGISTER_FINALIZER_NO_ORDER(local2, finalizer, (void*)2, 0, 0);
77
local3 = GC_MALLOC(12);
78
GC_REGISTER_FINALIZER_NO_ORDER(local3, finalizer, (void*)3, 0, 0);
79
local4 = GC_MALLOC(12);
80
GC_REGISTER_FINALIZER_NO_ORDER(local4, finalizer, (void*)4, 0, 0);
82
void **globalData = (void**)global;
83
globalData[0] = local;
84
globalData[1] = local2;
86
void **localData = (void**)local;
87
localData[0] = local3;
89
void **local2Data = (void**)local2;
90
local2Data[0] = local4; // actually ignored, because local2 is atomic, so 4 is freeable
92
emscripten_async_call(waiter, NULL, 100);