From 41f1544332cddfa9a636c05f41371698a891de63 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Thu, 28 Jun 2012 15:48:03 -0500 Subject: [PATCH] Add front-end name to InitMessage from WriterFrontend to Backend. At the time WriterBackend::Init() happens, it's in a different thread than its frontend member, but tried to access it directly to get its name, that info is now sent in the InitMessage instead. (Problem was observed segfaulting the unit test scripts.base.frameworks.notice.mail-alarms on Ubuntu 12.04). --- src/logging/WriterBackend.cc | 4 ++-- src/logging/WriterBackend.h | 4 +++- src/logging/WriterFrontend.cc | 10 ++++++---- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/logging/WriterBackend.cc b/src/logging/WriterBackend.cc index 23a95279d7..836c390944 100644 --- a/src/logging/WriterBackend.cc +++ b/src/logging/WriterBackend.cc @@ -108,13 +108,13 @@ void WriterBackend::DisableFrontend() SendOut(new DisableMessage(frontend)); } -bool WriterBackend::Init(string arg_path, int arg_num_fields, const Field* const* arg_fields) +bool WriterBackend::Init(string arg_path, int arg_num_fields, const Field* const* arg_fields, string frontend_name) { path = arg_path; num_fields = arg_num_fields; fields = arg_fields; - string name = Fmt("%s/%s", path.c_str(), frontend->Name().c_str()); + string name = Fmt("%s/%s", path.c_str(), frontend_name.c_str()); SetName(name); diff --git a/src/logging/WriterBackend.h b/src/logging/WriterBackend.h index 1269976aee..64cf84630c 100644 --- a/src/logging/WriterBackend.h +++ b/src/logging/WriterBackend.h @@ -53,9 +53,11 @@ public: * @param fields An array of size \a num_fields with the log fields. * The methods takes ownership of the array. * + * @param frontend_name The name of the front-end writer implementation. + * * @return False if an error occured. */ - bool Init(string path, int num_fields, const threading::Field* const* fields); + bool Init(string path, int num_fields, const threading::Field* const* fields, string frontend_name); /** * Writes one log entry. diff --git a/src/logging/WriterFrontend.cc b/src/logging/WriterFrontend.cc index 33c9c04c63..cd3bd0d563 100644 --- a/src/logging/WriterFrontend.cc +++ b/src/logging/WriterFrontend.cc @@ -15,16 +15,18 @@ namespace logging { class InitMessage : public threading::InputMessage { public: - InitMessage(WriterBackend* backend, const string path, const int num_fields, const Field* const* fields) + InitMessage(WriterBackend* backend, const string path, const int num_fields, const Field* const* fields, string frontend_name) : threading::InputMessage("Init", backend), - path(path), num_fields(num_fields), fields(fields) { } + path(path), num_fields(num_fields), fields(fields), + frontend_name(frontend_name) { } - virtual bool Process() { return Object()->Init(path, num_fields, fields); } + virtual bool Process() { return Object()->Init(path, num_fields, fields, frontend_name); } private: const string path; const int num_fields; const Field * const* fields; + const string frontend_name; }; class RotateMessage : public threading::InputMessage @@ -164,7 +166,7 @@ void WriterFrontend::Init(string arg_path, int arg_num_fields, const Field* cons initialized = true; if ( backend ) - backend->SendIn(new InitMessage(backend, arg_path, arg_num_fields, arg_fields)); + backend->SendIn(new InitMessage(backend, arg_path, arg_num_fields, arg_fields, Name())); if ( remote ) remote_serializer->SendLogCreateWriter(stream,