s2n-tls icon indicating copy to clipboard operation
s2n-tls copied to clipboard

feat: add s2n_cleanup_thread and s2n_cleanup_final

Open WesleyRosenblum opened this issue 1 year ago • 0 comments

Description of changes:

s2n_cleanup() attempts to track the "main" thread that had called s2n_init(), and only perform a full cleanup of global s2n state if it is the called from the "main" thread. This may not work if the "main" thread is terminated before other threads have finished using s2n. In some cases, the other threads may be assigned the same thread ID that the "main" thread had used, resulting in premature cleanup.

This change introduces s2n_cleanup_thread() and s2n_cleanup_final() APIs so that customers with more advanced thread management may clean up thread-local and global state more deliberately without relying on s2n tracking the "main" thread.

Call-outs

I originally had the main_thread ID being zeroed after the main pthread exits, so that if s2n_cleanup() were to be called again from a different thread that had the same ID assigned, it wouldn't attempt the global cleanup. But when a pthread terminates, it doesn't actually call the atexit registered functions:

When a thread terminates, process-shared resources (e.g., mutexes, condition variables, semaphores, and file descriptors) are not released, and functions registered using atexit(3) are not called.

A terminated thread does allow for its ID to be reused though, so zeroing out the main thread ID in an atexit function would not be effective.

Testing:

Added unit tests

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.

WesleyRosenblum avatar Jun 05 '24 01:06 WesleyRosenblum