@@ -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;
@@ -131,16 +132,18 @@ void init_signals(void) {
131Stats terminate(VM* vm) {
132Stats terminate(VM* vm) {
132 Stats stats = vm->stats;
133 Stats stats = vm->stats;
133 STATS_ENTER_EXIT(stats)
134 STATS_ENTER_EXIT(stats)
137 free(vm->valstack);
135 free(vm->valstack);
138 free_heap(&(vm->heap));
136 free_heap(&(vm->heap));
139 c_heap_destroy(&(vm->c_heap));
137 c_heap_destroy(&(vm->c_heap));
140#ifdef HAS_PTHREAD
138#ifdef HAS_PTHREAD
141− pthread_mutex_destroy(&(vm -> inbox_lock));
139+ pthread_mutex_destroy(&(vm->inbox_lock));
142− pthread_mutex_destroy(&(vm -> inbox_block));
140+ pthread_mutex_destroy(&(vm->inbox_block));
141+ pthread_mutex_destroy(&(vm->alloc_lock));
143− pthread_cond_destroy(&(vm -> inbox_waiting));
142+ pthread_cond_destroy(&(vm->inbox_waiting));
144+ if (vm->creator != NULL) {
145+ vm->creator->processes--;
145 // free(vm);
148 // free(vm);
146 // Set the VM as inactive, so that if any message gets sent to it
149 // Set the VM as inactive, so that if any message gets sent to it
@@ -781,28 +784,25 @@ VAL idris_systemInfo(VM* vm, VAL index) {
781 return MKSTR(vm, "");
784 return MKSTR(vm, "");
784typedef struct {
788typedef struct {
785 VM* vm; // thread's VM
789 VM* vm; // thread's VM
786− VM* callvm; // calling thread's VM
789} ThreadData;
792} ThreadData;
792void* runThread(void* arg) {
794void* runThread(void* arg) {
793 ThreadData* td = (ThreadData*)arg;
795 ThreadData* td = (ThreadData*)arg;
794 VM* vm = td->vm;
796 VM* vm = td->vm;
795− VM* callvm = td->callvm;
797+ func fn = td->fn;
797 init_threaddata(vm);
799 init_threaddata(vm);
799 TOP(0) = td->arg;
801 TOP(0) = td->arg;
800 BASETOP(0);
802 BASETOP(0);
801 ADDTOP(1);
803 ADDTOP(1);
803− callvm->processes--;
805 free(td);
804 free(td);
807 // Stats stats =
807 // Stats stats =
808 terminate(vm);
808 terminate(vm);
@@ -814,6 +814,7 @@ void* vmThread(VM* callvm, func f, VAL arg) {
814 VM* vm = init_vm(callvm->stack_max - callvm->valstack, callvm->heap.size,
814 VM* vm = init_vm(callvm->stack_max - callvm->valstack, callvm->heap.size,
815 callvm->max_threads);
815 callvm->max_threads);
816 vm->processes=1; // since it can send and receive messages
816 vm->processes=1; // since it can send and receive messages
817+ vm->creator = callvm;
817 pthread_t t;
818 pthread_t t;
818 pthread_attr_t attr;
819 pthread_attr_t attr;
819// size_t stacksize;
820// size_t stacksize;
@@ -822,15 +823,15 @@ void* vmThread(VM* callvm, func f, VAL arg) {
822// pthread_attr_getstacksize (&attr, &stacksize);
823// pthread_attr_getstacksize (&attr, &stacksize);
823// pthread_attr_setstacksize (&attr, stacksize*64);
824// pthread_attr_setstacksize (&attr, stacksize*64);
825− ThreadData *td = malloc(sizeof(ThreadData));
826+ ThreadData *td = malloc(sizeof(ThreadData)); // free'd in runThread
826 td->vm = vm;
827 td->vm = vm;
827− td->callvm = callvm;
828 td->fn = f;
828 td->fn = f;
829 td->arg = copyTo(vm, arg);
829 td->arg = copyTo(vm, arg);
831 callvm->processes++;
831 callvm->processes++;
833 int ok = pthread_create(&t, &attr, runThread, td);
833 int ok = pthread_create(&t, &attr, runThread, td);
834+ pthread_attr_destroy(&attr);
834// usleep(100);
835// usleep(100);
835 if (ok == 0) {
836 if (ok == 0) {
836 return vm;
837 return vm;
@@ -841,7 +842,7 @@ void* vmThread(VM* callvm, func f, VAL arg) {
843void* idris_stopThread(VM* vm) {
844void* idris_stopThread(VM* vm) {
844− close_vm(vm);
845+ terminate(vm);
845 pthread_exit(NULL);
846 pthread_exit(NULL);
846 return NULL;
847 return NULL;