Dear mailing list, the following issue has occurred when embedding CHICKEN 5.4.0 in a multithreaded C program. I have reproduced the issue on macOS and NetBSD 10. Either I am doing something wrong or this is a bug.
The program I am embedding just returns the squared input. ;; x.scm (import (chicken platform) (chicken foreign)) (define-external (bar (int i)) int (* i i)) (return-to-host) The C program starts one extra thread and then both threads call the exported function bar. To ensure no concurrency issues occur, I have protected the calls to bar with a pthread mutex. // y.c #include <chicken.h> #include <pthread.h> #include <stdio.h> #include <unistd.h> extern int bar(int); static pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; static int call(void) { pthread_mutex_lock(&m); int r = bar(1); pthread_mutex_unlock(&m); return r; } static void *run(void *_) { printf("value: %d\n", call()); sleep(1); printf("value: %d\n", call()); return 0; } int main(void) { CHICKEN_run(C_toplevel); pthread_t t; pthread_create(&t, 0, run, 0); run(0); pthread_join(t, 0); return 0; } To build and run the test case, I used: csc -e -o test x.scm y.c ./test >From CHICKEN's documentation, I had the impression that this interface usage should be supported. Am I doing something silly? Can anybody reproduce this issue on other systems? Last comment: I have started this with gdb and one thread does not leave C_save_and_reclaim, IIRC. I keeps calling some mark_* and C_reclaim functions. My libchicken does not have symbols, so I couldn't look in more details what is happening, but it looks like the thread never leaves the function. That only happens if I call the interface with two or more threads. -Diogo