From c7242bfe5e85d0d8bcb4b7548f372a97ce068787 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 21 Mar 2012 17:05:19 -0700 Subject: [PATCH] log: flush on_exit Signed-off-by: Sage Weil --- src/log/Log.cc | 18 +++++++++++++++++- src/log/Log.h | 2 ++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/log/Log.cc b/src/log/Log.cc index 8373f0ba74aab..7f2a62fd3a5b4 100644 --- a/src/log/Log.cc +++ b/src/log/Log.cc @@ -20,8 +20,16 @@ namespace ceph { namespace log { +static void log_on_exit(int r, void *p) +{ + Log *l = *(Log **)p; + if (l) + l->flush(); +} + Log::Log(SubsystemMap *s) - : m_subs(s), + : m_indirect_this(new (Log*)(this)), // we will deliberately leak this + m_subs(s), m_new(DEFAULT_MAX_NEW), m_recent(DEFAULT_MAX_RECENT), m_fd(-1), m_syslog_log(-1), m_syslog_crash(-1), @@ -30,6 +38,12 @@ Log::Log(SubsystemMap *s) { int ret; + // Make sure we flush on shutdown. We do this by deliberately + // leaking an indirect pointer to ourselves (on_exit() can't + // unregister a callback). This is not racy only becuase we + // assume that exit() won't race with ~Log(). + on_exit(log_on_exit, m_indirect_this); + ret = pthread_spin_init(&m_lock, PTHREAD_PROCESS_SHARED); assert(ret == 0); @@ -45,6 +59,8 @@ Log::Log(SubsystemMap *s) Log::~Log() { + *m_indirect_this = NULL; + assert(!is_started()); if (m_fd >= 0) TEMP_FAILURE_RETRY(::close(m_fd)); diff --git a/src/log/Log.h b/src/log/Log.h index e8a497e01e756..13faac576cc69 100644 --- a/src/log/Log.h +++ b/src/log/Log.h @@ -17,6 +17,8 @@ namespace log { class Log : private Thread { + Log **m_indirect_this; + SubsystemMap *m_subs; pthread_spinlock_t m_lock; -- 2.39.5