svn commit: r325389 - head/lib/libc/stdlib

Konstantin Belousov kib at FreeBSD.org
Sat Nov 4 10:53:00 UTC 2017


Author: kib
Date: Sat Nov  4 10:52:58 2017
New Revision: 325389
URL: https://svnweb.freebsd.org/changeset/base/325389

Log:
  C++17 requires quick_exit(3) to be async-signal safe.
  
  Make it safe, and update man page with the useful information.
  
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week

Modified:
  head/lib/libc/stdlib/quick_exit.3
  head/lib/libc/stdlib/quick_exit.c

Modified: head/lib/libc/stdlib/quick_exit.3
==============================================================================
--- head/lib/libc/stdlib/quick_exit.3	Sat Nov  4 10:51:52 2017	(r325388)
+++ head/lib/libc/stdlib/quick_exit.3	Sat Nov  4 10:52:58 2017	(r325389)
@@ -24,7 +24,7 @@
 .\"
 .\"  $FreeBSD$
 .\"
-.Dd December 13, 2014
+.Dd November 4, 2017
 .Dt QUICK_EXIT 3
 .Os
 .Sh NAME
@@ -44,6 +44,17 @@ with
 .Xr at_quick_exit 3
 but not any C++ destructors or cleanup code registered with
 .Xr atexit 3 .
+The
+.Xr stdio 3
+file buffers are not flushed.
+.Pp
+The function
+.Fn quick_exit
+is
+.Em async-signal safe
+when the functions registered with
+.Xr at_quick_exit 3
+are.
 .Sh RETURN VALUES
 The
 .Fn quick_exit

Modified: head/lib/libc/stdlib/quick_exit.c
==============================================================================
--- head/lib/libc/stdlib/quick_exit.c	Sat Nov  4 10:51:52 2017	(r325388)
+++ head/lib/libc/stdlib/quick_exit.c	Sat Nov  4 10:52:58 2017	(r325389)
@@ -26,6 +26,8 @@
  * $FreeBSD$
  */
 
+#include <sys/types.h>
+#include <machine/atomic.h>
 #include <stdlib.h>
 #include <pthread.h>
 
@@ -60,6 +62,7 @@ at_quick_exit(void (*func)(void))
 	h->cleanup = func;
 	pthread_mutex_lock(&atexit_mutex);
 	h->next = handlers;
+	__compiler_membar();
 	handlers = h;
 	pthread_mutex_unlock(&atexit_mutex);
 	return (0);
@@ -74,7 +77,9 @@ quick_exit(int status)
 	 * XXX: The C++ spec requires us to call std::terminate if there is an
 	 * exception here.
 	 */
-	for (h = handlers; NULL != h; h = h->next)
+	for (h = handlers; NULL != h; h = h->next) {
+		__compiler_membar();
 		h->cleanup();
+	}
 	_Exit(status);
 }


More information about the svn-src-head mailing list