Loading...
stdlib/FreeBSD/exit.c Libc-1353.41.1 Libc-763.12
--- Libc/Libc-1353.41.1/stdlib/FreeBSD/exit.c
+++ Libc/Libc-763.12/stdlib/FreeBSD/exit.c
@@ -27,9 +27,6 @@
  * SUCH DAMAGE.
  */
 
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wstrict-prototypes"
-
 #if defined(LIBC_SCCS) && !defined(lint)
 static char sccsid[] = "@(#)exit.c	8.1 (Berkeley) 6/4/93";
 #endif /* LIBC_SCCS and not lint */
@@ -44,26 +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;
 {
-#if !TARGET_IPHONE_SIMULATOR && (__i386__ || __x86_64__)
-	_tlv_exit(); // C++11 requires thread_local objects to be destroyed before global objects
-#endif
+	/* 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);
+	_exit(status);
 }
-#pragma clang diagnostic pop