@@ -72,6 +72,7 @@ VM* init_vm(int stack_size, size_t heap_size,
73 vm->max_threads = max_threads;
73 vm->max_threads = max_threads;
74 vm->processes = 0;
74 vm->processes = 0;
77 global_vm = vm;
78 global_vm = vm;
@@ -784,7 +785,6 @@ VAL idris_systemInfo(VM* vm, VAL index) {
784#ifdef HAS_PTHREAD
785#ifdef HAS_PTHREAD
785typedef struct {
786typedef struct {
786 VM* vm; // thread's VM
787 VM* vm; // thread's VM
787− VM* callvm; // calling thread's VM
790} ThreadData;
790} ThreadData;
@@ -792,21 +792,17 @@ typedef struct {
792void* runThread(void* arg) {
792void* runThread(void* arg) {
793 ThreadData* td = (ThreadData*)arg;
793 ThreadData* td = (ThreadData*)arg;
794 VM* vm = td->vm;
794 VM* vm = td->vm;
795− VM* callvm = td->callvm;
795+ func fn = td->fn;
797 init_threaddata(vm);
797 init_threaddata(vm);
799 TOP(0) = td->arg;
799 TOP(0) = td->arg;
800 BASETOP(0);
800 BASETOP(0);
801 ADDTOP(1);
801 ADDTOP(1);
803− callvm->processes--;
805 free(td);
802 free(td);
807− // Stats stats =
805+ assert(0); // will not be reached
809− // aggregate_stats(&(td->vm->stats), &stats);
810 return NULL;
806 return NULL;
@@ -814,6 +810,7 @@ void* vmThread(VM* callvm, func f, VAL arg) {
814 VM* vm = init_vm(callvm->stack_max - callvm->valstack, callvm->heap.size,
810 VM* vm = init_vm(callvm->stack_max - callvm->valstack, callvm->heap.size,
815 callvm->max_threads);
811 callvm->max_threads);
816 vm->processes=1; // since it can send and receive messages
812 vm->processes=1; // since it can send and receive messages
813+ vm->creator = callvm;
817 pthread_t t;
814 pthread_t t;
818 pthread_attr_t attr;
815 pthread_attr_t attr;
819// size_t stacksize;
816// size_t stacksize;
@@ -822,9 +819,8 @@ void* vmThread(VM* callvm, func f, VAL arg) {
822// pthread_attr_getstacksize (&attr, &stacksize);
819// pthread_attr_getstacksize (&attr, &stacksize);
823// pthread_attr_setstacksize (&attr, stacksize*64);
820// pthread_attr_setstacksize (&attr, stacksize*64);
825− ThreadData *td = malloc(sizeof(ThreadData));
822+ ThreadData *td = malloc(sizeof(ThreadData)); // free'd in runThread
826 td->vm = vm;
823 td->vm = vm;
827− td->callvm = callvm;
828 td->fn = f;
824 td->fn = f;
829 td->arg = copyTo(vm, arg);
825 td->arg = copyTo(vm, arg);
@@ -841,7 +837,10 @@ void* vmThread(VM* callvm, func f, VAL arg) {
843void* idris_stopThread(VM* vm) {
839void* idris_stopThread(VM* vm) {
844− close_vm(vm);
840+ if (vm->creator != NULL) {
841+ vm->creator->processes--;
845 pthread_exit(NULL);
844 pthread_exit(NULL);
846 return NULL;
845 return NULL;