mirror of
https://github.com/Zygo/bees.git
synced 2025-05-17 13:25: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;
|
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
|
bool
|
||||||
BeesContext::is_root_ro(uint64_t root)
|
BeesContext::is_root_ro(uint64_t root)
|
||||||
{
|
{
|
||||||
@ -962,6 +946,15 @@ BeesContext::start()
|
|||||||
BEESLOGNOTICE("Starting bees main loop...");
|
BEESLOGNOTICE("Starting bees main loop...");
|
||||||
BEESNOTE("starting BeesContext");
|
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
|
// Set up temporary file pool
|
||||||
m_tmpfile_pool.generator([=]() -> shared_ptr<BeesTempFile> {
|
m_tmpfile_pool.generator([=]() -> shared_ptr<BeesTempFile> {
|
||||||
return make_shared<BeesTempFile>(shared_from_this());
|
return make_shared<BeesTempFile>(shared_from_this());
|
||||||
@ -1043,7 +1036,7 @@ BeesContext::stop()
|
|||||||
|
|
||||||
BEESNOTE("waiting for progress thread");
|
BEESNOTE("waiting for progress thread");
|
||||||
BEESLOGDEBUG("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
|
// XXX: nobody can see this BEESNOTE because we are killing the
|
||||||
// thread that publishes it
|
// thread that publishes it
|
||||||
@ -1053,7 +1046,7 @@ BeesContext::stop()
|
|||||||
m_stop_status = true;
|
m_stop_status = true;
|
||||||
m_stop_condvar.notify_all();
|
m_stop_condvar.notify_all();
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
m_status_thread.join();
|
m_status_thread->join();
|
||||||
|
|
||||||
BEESLOGNOTICE("bees stopped in " << stop_timer << " sec");
|
BEESLOGNOTICE("bees stopped in " << stop_timer << " sec");
|
||||||
}
|
}
|
||||||
|
@ -70,11 +70,6 @@ BeesThread::~BeesThread()
|
|||||||
|
|
||||||
BEESLOGDEBUG("BeesThread destructor " << m_name);
|
BEESLOGDEBUG("BeesThread destructor " << m_name);
|
||||||
if (m_thread_ptr->joinable()) {
|
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);
|
BEESLOGDEBUG("Waiting for thread " << m_name);
|
||||||
Timer thread_time;
|
Timer thread_time;
|
||||||
m_thread_ptr->join();
|
m_thread_ptr->join();
|
||||||
|
@ -751,8 +751,8 @@ class BeesContext : public enable_shared_from_this<BeesContext> {
|
|||||||
condition_variable m_abort_condvar;
|
condition_variable m_abort_condvar;
|
||||||
bool m_abort_requested = false;
|
bool m_abort_requested = false;
|
||||||
|
|
||||||
BeesThread m_progress_thread;
|
shared_ptr<BeesThread> m_progress_thread;
|
||||||
BeesThread m_status_thread;
|
shared_ptr<BeesThread> m_status_thread;
|
||||||
|
|
||||||
void set_root_fd(Fd fd);
|
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);
|
void rewrite_file_range(const BeesFileRange &bfr);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BeesContext(shared_ptr<BeesContext> parent_ctx = nullptr);
|
BeesContext() = default;
|
||||||
|
|
||||||
void set_root_path(string path);
|
void set_root_path(string path);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user