on master help sign in
Create a new VM if started on a thread without one.
commit197ce4cbcf8f2a2074e6f8d2f65143c66abc9b41 authorNiklas Larsson <niklas@mm.st> dateThu 17 Mar 2016, 22:47 (11 years ago) parent23df314
2 files changed+10−3
rts/idris_rts.c+9−1 src/IRTS/CodegenC.hs+1−2
rts/idris_rts.c+9−1
@@ -82,6 +82,7 @@ VM* idris_vm() {
8282
8383VM* get_vm(void) {
8484#ifdef HAS_PTHREAD
85+ init_threadkeys();
8586 return pthread_getspecific(vm_key);
8687#else
8788 return global_vm;
@@ -92,9 +93,16 @@ void close_vm(VM* vm) {
9293 terminate(vm);
9394}
9495
95−void init_threadkeys() {
9696#ifdef HAS_PTHREAD
97+void create_key() {
9798 pthread_key_create(&vm_key, (void*)free_key);
99+}
100+#endif
101+
102+void init_threadkeys() {
103+#ifdef HAS_PTHREAD
104+ static pthread_once_t key_once = PTHREAD_ONCE_INIT;
105+ pthread_once(&key_once, create_key);
98106#endif
99107}
100108
src/IRTS/CodegenC.hs+1−2
@@ -805,8 +805,7 @@ genWrapper (desc, tag) = ret ++ " " ++ wrapperName tag ++ "(" ++
805805 (if ret /= "void" then indent 1 ++ ret ++ " ret;\n" else "") ++
806806 indent 1 ++ "VM* vm = get_vm();\n" ++
807807 indent 1 ++ "if (vm == NULL) {\n" ++
808− indent 2 ++ "fprintf(stderr, \"No vm available in callback.\");\n" ++
809− indent 2 ++ "exit(-1);\n" ++
808+ indent 2 ++ "vm = idris_vm();\n" ++
810809 indent 1 ++ "}\n" ++
811810 indent 1 ++ "INITFRAME;\n" ++
812811 indent 1 ++ "RESERVE(" ++ show (len + 1) ++ ");\n" ++