on master help sign in
Merge pull request #3044 from melted/cb_threads
ec97cacNiklas Larsson
rts/idris_rts.c+9−1
@@ -82,6 +82,7 @@ VM* idris_vm() {
82
82
83VM* get_vm(void) {
83VM* get_vm(void) {
84#ifdef HAS_PTHREAD
84#ifdef HAS_PTHREAD
85+ init_threadkeys();
85 return pthread_getspecific(vm_key);
86 return pthread_getspecific(vm_key);
86#else
87#else
87 return global_vm;
88 return global_vm;
@@ -92,9 +93,16 @@ void close_vm(VM* vm) {
92 terminate(vm);
93 terminate(vm);
93}
94}
94
95
95−void init_threadkeys() {
96#ifdef HAS_PTHREAD
96#ifdef HAS_PTHREAD
97+void create_key() {
97 pthread_key_create(&vm_key, (void*)free_key);
98 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);
98#endif
106#endif
99}
107}
100
108
src/IRTS/CodegenC.hs+1−2
@@ -805,8 +805,7 @@ genWrapper (desc, tag) = ret ++ " " ++ wrapperName tag ++ "(" ++
805 (if ret /= "void" then indent 1 ++ ret ++ " ret;\n" else "") ++
805 (if ret /= "void" then indent 1 ++ ret ++ " ret;\n" else "") ++
806 indent 1 ++ "VM* vm = get_vm();\n" ++
806 indent 1 ++ "VM* vm = get_vm();\n" ++
807 indent 1 ++ "if (vm == NULL) {\n" ++
807 indent 1 ++ "if (vm == NULL) {\n" ++
808− indent 2 ++ "fprintf(stderr, \"No vm available in callback.\");\n" ++
808+ indent 2 ++ "vm = idris_vm();\n" ++
809− indent 2 ++ "exit(-1);\n" ++
810 indent 1 ++ "}\n" ++
809 indent 1 ++ "}\n" ++
811 indent 1 ++ "INITFRAME;\n" ++
810 indent 1 ++ "INITFRAME;\n" ++
812 indent 1 ++ "RESERVE(" ++ show (len + 1) ++ ");\n" ++
811 indent 1 ++ "RESERVE(" ++ show (len + 1) ++ ");\n" ++