Skip to content

Commit

Permalink
get rid of threads in the scoped_timer thread pool prior to forking, …
Browse files Browse the repository at this point in the history
…on non-Windows (#4833)

* on POSIX systems, fork() is dangerous in the presence of a thread
pool, because the child process inherits only the thread from the
parent that actually called fork().

this patch winds down the scoped_timer thread pool in preparation for
forking; workers will get freshly created again following the fork
call.
  • Loading branch information
regehr authored Nov 29, 2020
1 parent 05c5f72 commit b7e1b1e
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 0 deletions.
14 changes: 14 additions & 0 deletions src/util/scoped_timer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ Revision History:
#include <mutex>
#include <thread>
#include <vector>
#ifndef _WINDOWS
#include <pthread.h>
#endif

struct scoped_timer_state {
std::thread * m_thread { nullptr };
Expand Down Expand Up @@ -119,6 +122,16 @@ scoped_timer::~scoped_timer() {
dealloc(m_imp);
}

void scoped_timer::initialize() {
#ifndef _WINDOWS
static bool pthread_atfork_set = false;
if (!pthread_atfork_set) {
pthread_atfork(finalize, nullptr, nullptr);
pthread_atfork_set = true;
}
#endif
}

void scoped_timer::finalize() {
unsigned deleted = 0;
while (deleted < num_workers) {
Expand All @@ -138,4 +151,5 @@ void scoped_timer::finalize() {
delete w;
}
}
num_workers = 0;
}
5 changes: 5 additions & 0 deletions src/util/scoped_timer.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,10 @@ class scoped_timer {
public:
scoped_timer(unsigned ms, event_handler * eh);
~scoped_timer();
static void initialize();
static void finalize();
};

/*
ADD_INITIALIZER('scoped_timer::initialize();')
*/

0 comments on commit b7e1b1e

Please # to comment.