on master help sign in
Small GC fix, and not for message passing
e2587d5Edwin Brady
rts/idris_gc.c+3
@@ -86,6 +86,9 @@ void gc(VM* vm) {
86 for(root = vm->valstack; root < vm->valstack_top; ++root) {
86 for(root = vm->valstack; root < vm->valstack_top; ++root) {
87 *root = copy(vm, *root);
87 *root = copy(vm, *root);
88 }
88 }
89+ for(root = vm->inbox_ptr; root < vm->inbox_write; ++root) {
90+ *root = copy(vm, *root);
91+ }
89 vm->ret = copy(vm, vm->ret);
92 vm->ret = copy(vm, vm->ret);
90 vm->reg1 = copy(vm, vm->reg1);
93 vm->reg1 = copy(vm, vm->reg1);
91
94
rts/idris_rts.c+3
@@ -414,6 +414,9 @@ VAL copyTo(VM* vm, VAL x) {
414
414
415// Add a message to another VM's message queue
415// Add a message to another VM's message queue
416void sendMessage(VM* sender, VM* dest, VAL msg) {
416void sendMessage(VM* sender, VM* dest, VAL msg) {
417+ // FIXME: If GC kicks in in the middle of the copy, we're in trouble.
418+ // Probably best check there is enough room in advance. (How?)
419+
417 VAL dmsg = copyTo(dest, msg);
420 VAL dmsg = copyTo(dest, msg);
418
421
419 pthread_mutex_lock(&(dest->inbox_lock));
422 pthread_mutex_lock(&(dest->inbox_lock));