Make garbage collection thread safe

- You can now use _gc(malloc()) in multithreaded programs
- This change fixes a bug where fork() on NT disabled TLS
- Fixed TLS code morphing on XNU/NT, for R8-R15 registers
This commit is contained in:
Justine Tunney 2022-09-08 02:33:01 -07:00
parent 571c2c3c69
commit 0e2b1bfeed
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
37 changed files with 310 additions and 189 deletions

View file

@ -18,6 +18,7 @@
*/
#include "libc/intrin/pthread.h"
#include "libc/nexgen32e/gettls.h"
#include "libc/runtime/gc.h"
#include "libc/thread/posixthread.internal.h"
#include "libc/thread/spawn.h"
#include "libc/thread/thread.h"
@ -38,7 +39,7 @@ wontreturn void pthread_exit(void *rc) {
struct PosixThread *pt;
if ((pt = ((cthread_t)__get_tls())->pthread)) {
pt->rc = rc;
longjmp(pt->exiter, 1);
_gclongjmp(pt->exiter, 1);
} else {
_Exit1((int)(intptr_t)rc);
}