Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F133142709
D46108.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
1 KB
Referenced Files
None
Subscribers
None
D46108.diff
View Options
diff --git a/lib/libc/stdlib/exit.3 b/lib/libc/stdlib/exit.3
--- a/lib/libc/stdlib/exit.3
+++ b/lib/libc/stdlib/exit.3
@@ -29,7 +29,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd August 5, 2021
+.Dd July 24, 2024
.Dt EXIT 3
.Os
.Sh NAME
@@ -102,6 +102,23 @@
.Xr sysexits 3
may be used to provide more information to the parent process.
.Pp
+Calls to the
+.Fn exit
+function are serialized.
+All functions registered by
+.Xr atexit 3
+are executed in the first thread that called
+.Nm exit .
+If any other thread of the process calls
+.Nm exit
+before all registered functions have completed or before the process
+terminates, the thread is blocked until the process terminates.
+The exit status of the process is the
+.Fa status
+argument of the first
+.Nm exit
+call which thread proceeds the atexit handlers.
+.Pp
Note that
.Fn exit
does nothing to prevent bottomless recursion should a function registered
diff --git a/lib/libc/stdlib/exit.c b/lib/libc/stdlib/exit.c
--- a/lib/libc/stdlib/exit.c
+++ b/lib/libc/stdlib/exit.c
@@ -31,6 +31,7 @@
#include "namespace.h"
#include <stdlib.h>
+#include <pthread.h>
#include <unistd.h>
#include "un-namespace.h"
@@ -48,6 +49,20 @@
*/
int __isthreaded = 0;
+static pthread_mutex_t exit_mutex;
+static pthread_once_t exit_mutex_once = PTHREAD_ONCE_INIT;
+
+static void
+exit_mutex_init_once(void)
+{
+ pthread_mutexattr_t ma;
+
+ _pthread_mutexattr_init(&ma);
+ _pthread_mutexattr_settype(&ma, PTHREAD_MUTEX_RECURSIVE);
+ _pthread_mutex_init(&exit_mutex, &ma);
+ _pthread_mutexattr_destroy(&ma);
+}
+
/*
* Exit, flushing stdio buffers if necessary.
*/
@@ -59,6 +74,12 @@
_thread_autoinit_dummy_decl = 1;
+ /* Make exit(3) thread-safe */
+ if (__isthreaded) {
+ _once(&exit_mutex_once, exit_mutex_init_once);
+ _pthread_mutex_lock(&exit_mutex);
+ }
+
/*
* We're dealing with cleaning up thread_local destructors in the case of
* the process termination through main() exit.
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Oct 24, 8:38 AM (12 h, 25 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24125883
Default Alt Text
D46108.diff (1 KB)
Attached To
Mode
D46108: exit(3): make it thread-safe
Attached
Detach File
Event Timeline
Log In to Comment