Loading...
--- Libc/Libc-1082.20.4/stdlib/FreeBSD/exit.c
+++ Libc/Libc-763.13/stdlib/FreeBSD/exit.c
@@ -41,17 +41,31 @@
#include "atexit.h"
#include "libc_private.h"
-#include <TargetConditionals.h>
+void (*__cleanup)(void);
-void (*__cleanup)(void);
-extern void __exit(int) __attribute__((noreturn));
-#if !TARGET_IPHONE_SIMULATOR && (__i386__ || __x86_64__)
-extern void _tlv_exit();
-#endif
+/*
+ * This variable is zero until a process has created a thread.
+ * It is used to avoid calling locking functions in libc when they
+ * are not required. By default, libc is intended to be(come)
+ * thread-safe, but without a (significant) penalty to non-threaded
+ * processes.
+ */
+int __isthreaded = 0;
/*
* Exit, flushing stdio buffers if necessary.
*/
void
-exit(int status)
+exit(status)
+ int status;
{
+ /* Ensure that the auto-initialization routine is linked in: */
+ extern int _thread_autoinit_dummy_decl;
+
+ _thread_autoinit_dummy_decl = 1;
+
+ __cxa_finalize(NULL);
+ if (__cleanup)
+ (*__cleanup)();
+ _exit(status);
+}