mirror of
https://github.com/Zygo/bees.git
synced 2025-05-17 05:15:45 +02:00
context: get rid of all instances of pthread_cancel
pthread_cancel doesn't really work properly. It was only being used in bees to bring threads to a stop if the BeesContext is destroyed early. It is frequently implicated in core dump reports because of the fragility of the C++ iostream / C stdio / library infrastructure, particularly surrounding upgrades on the host running bees. The pthread_cancel call itself often simply fails even when it doesn't call terminate(). Defer creation of the status and progress threads until after the BeesContext::start method is invoked. At that point, the existing ask-threads-nicely-to-stop code is up and running, and normal condvars can be used to bring bees to a stop, without having to resort to pthread_cancel. Since we're deleting half of the BeesContext constructor in this change, let's remove the other half too, and put an end to the deprecated support for multiple BeesContexts sharing a process. It's still possible to run multiple BeesContexts, but they will not share a FD cache. This will allow the FD cache's keys to become smaller and hopefully save some memory later on. Fixes: #171 Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
parent
243480b515
commit
db65031c2b
@ -178,22 +178,6 @@ BeesContext::home_fd()
|
||||
return m_home_fd;
|
||||
}
|
||||
|
||||
BeesContext::BeesContext(shared_ptr<BeesContext> parent) :
|
||||
m_parent_ctx(parent),
|
||||
m_progress_thread("progress_report"),
|
||||
m_status_thread("status_report")
|
||||
{
|
||||
if (m_parent_ctx) {
|
||||
m_fd_cache = m_parent_ctx->fd_cache();
|
||||
}
|
||||
m_progress_thread.exec([=]() {
|
||||
show_progress();
|
||||
});
|
||||
m_status_thread.exec([=]() {
|
||||
dump_status();
|
||||
});
|
||||
}
|
||||
|
||||
bool
|
||||
BeesContext::is_root_ro(uint64_t root)
|
||||
{
|
||||
@ -962,6 +946,15 @@ BeesContext::start()
|
||||
BEESLOGNOTICE("Starting bees main loop...");
|
||||
BEESNOTE("starting BeesContext");
|
||||
|
||||
m_progress_thread = make_shared<BeesThread>("progress_report");
|
||||
m_status_thread = make_shared<BeesThread>("status_report");
|
||||
m_progress_thread->exec([=]() {
|
||||
show_progress();
|
||||
});
|
||||
m_status_thread->exec([=]() {
|
||||
dump_status();
|
||||
});
|
||||
|
||||
// Set up temporary file pool
|
||||
m_tmpfile_pool.generator([=]() -> shared_ptr<BeesTempFile> {
|
||||
return make_shared<BeesTempFile>(shared_from_this());
|
||||
@ -1043,7 +1036,7 @@ BeesContext::stop()
|
||||
|
||||
BEESNOTE("waiting for progress thread");
|
||||
BEESLOGDEBUG("Waiting for progress thread");
|
||||
m_progress_thread.join();
|
||||
m_progress_thread->join();
|
||||
|
||||
// XXX: nobody can see this BEESNOTE because we are killing the
|
||||
// thread that publishes it
|
||||
@ -1053,7 +1046,7 @@ BeesContext::stop()
|
||||
m_stop_status = true;
|
||||
m_stop_condvar.notify_all();
|
||||
lock.unlock();
|
||||
m_status_thread.join();
|
||||
m_status_thread->join();
|
||||
|
||||
BEESLOGNOTICE("bees stopped in " << stop_timer << " sec");
|
||||
}
|
||||
|
@ -70,11 +70,6 @@ BeesThread::~BeesThread()
|
||||
|
||||
BEESLOGDEBUG("BeesThread destructor " << m_name);
|
||||
if (m_thread_ptr->joinable()) {
|
||||
BEESLOGDEBUG("Cancelling thread " << m_name);
|
||||
int rv = pthread_cancel(m_thread_ptr->native_handle());
|
||||
if (rv) {
|
||||
BEESLOGDEBUG("pthread_cancel returned " << strerror(-rv));
|
||||
}
|
||||
BEESLOGDEBUG("Waiting for thread " << m_name);
|
||||
Timer thread_time;
|
||||
m_thread_ptr->join();
|
||||
|
@ -751,8 +751,8 @@ class BeesContext : public enable_shared_from_this<BeesContext> {
|
||||
condition_variable m_abort_condvar;
|
||||
bool m_abort_requested = false;
|
||||
|
||||
BeesThread m_progress_thread;
|
||||
BeesThread m_status_thread;
|
||||
shared_ptr<BeesThread> m_progress_thread;
|
||||
shared_ptr<BeesThread> m_status_thread;
|
||||
|
||||
void set_root_fd(Fd fd);
|
||||
|
||||
@ -763,7 +763,7 @@ class BeesContext : public enable_shared_from_this<BeesContext> {
|
||||
void rewrite_file_range(const BeesFileRange &bfr);
|
||||
|
||||
public:
|
||||
BeesContext(shared_ptr<BeesContext> parent_ctx = nullptr);
|
||||
BeesContext() = default;
|
||||
|
||||
void set_root_path(string path);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user