on master help sign in
Merge pull request #4678 from mokshasoft/small-rts-fixes

Small rts fixes

commitc736c53aba24e4300e8cf838f4661c1fa4cff4c7 authorNiklas Larsson <metaniklas@gmail.com> dateWed 10 Apr 2019, 11:22 (8 years ago) parentcb90bf872bcc27
2 files changed+17−15
rts/idris_rts.c+16−15 rts/idris_rts.h+1
rts/idris_rts.c+16−15
@@ -72,6 +72,7 @@ VM* init_vm(int stack_size, size_t heap_size,
7272
7373 vm->max_threads = max_threads;
7474 vm->processes = 0;
75+ vm->creator = NULL;
7576
7677#else
7778 global_vm = vm;
@@ -131,16 +132,18 @@ void init_signals(void) {
131132Stats terminate(VM* vm) {
132133 Stats stats = vm->stats;
133134 STATS_ENTER_EXIT(stats)
134−#ifdef HAS_PTHREAD
135− free(vm->inbox);
136−#endif
137135 free(vm->valstack);
138136 free_heap(&(vm->heap));
139137 c_heap_destroy(&(vm->c_heap));
140138#ifdef HAS_PTHREAD
141− pthread_mutex_destroy(&(vm -> inbox_lock));
142− pthread_mutex_destroy(&(vm -> inbox_block));
143− pthread_cond_destroy(&(vm -> inbox_waiting));
139+ pthread_mutex_destroy(&(vm->inbox_lock));
140+ pthread_mutex_destroy(&(vm->inbox_block));
141+ pthread_mutex_destroy(&(vm->alloc_lock));
142+ pthread_cond_destroy(&(vm->inbox_waiting));
143+ free(vm->inbox);
144+ if (vm->creator != NULL) {
145+ vm->creator->processes--;
146+ }
144147#endif
145148 // free(vm);
146149 // 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) {
781784 return MKSTR(vm, "");
782785}
783786
787+#ifdef HAS_PTHREAD
784788typedef struct {
785789 VM* vm; // thread's VM
786− VM* callvm; // calling thread's VM
787790 func fn;
788791 VAL arg;
789792} ThreadData;
790793
791−#ifdef HAS_PTHREAD
792794void* runThread(void* arg) {
793795 ThreadData* td = (ThreadData*)arg;
794796 VM* vm = td->vm;
795− VM* callvm = td->callvm;
797+ func fn = td->fn;
796798
797799 init_threaddata(vm);
798800
799801 TOP(0) = td->arg;
800802 BASETOP(0);
801803 ADDTOP(1);
802− td->fn(vm, NULL);
803− callvm->processes--;
804−
805804 free(td);
805+ fn(vm, NULL);
806806
807807 // Stats stats =
808808 terminate(vm);
@@ -814,6 +814,7 @@ void* vmThread(VM* callvm, func f, VAL arg) {
814814 VM* vm = init_vm(callvm->stack_max - callvm->valstack, callvm->heap.size,
815815 callvm->max_threads);
816816 vm->processes=1; // since it can send and receive messages
817+ vm->creator = callvm;
817818 pthread_t t;
818819 pthread_attr_t attr;
819820// size_t stacksize;
@@ -822,15 +823,15 @@ void* vmThread(VM* callvm, func f, VAL arg) {
822823// pthread_attr_getstacksize (&attr, &stacksize);
823824// pthread_attr_setstacksize (&attr, stacksize*64);
824825
825− ThreadData *td = malloc(sizeof(ThreadData));
826+ ThreadData *td = malloc(sizeof(ThreadData)); // free'd in runThread
826827 td->vm = vm;
827− td->callvm = callvm;
828828 td->fn = f;
829829 td->arg = copyTo(vm, arg);
830830
831831 callvm->processes++;
832832
833833 int ok = pthread_create(&t, &attr, runThread, td);
834+ pthread_attr_destroy(&attr);
834835// usleep(100);
835836 if (ok == 0) {
836837 return vm;
@@ -841,7 +842,7 @@ void* vmThread(VM* callvm, func f, VAL arg) {
841842}
842843
843844void* idris_stopThread(VM* vm) {
844− close_vm(vm);
845+ terminate(vm);
845846 pthread_exit(NULL);
846847 return NULL;
847848}
rts/idris_rts.h+1
@@ -152,6 +152,7 @@ struct VM {
152152
153153 int processes; // Number of child processes
154154 int max_threads; // maximum number of threads to run in parallel
155+ struct VM* creator; // The VM that created this VM, NULL for root VM
155156#endif
156157 Stats stats;
157158