| // Copyright 2017 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "base/fuchsia/fuchsia_logging.h" | 
 |  | 
 | #include <zircon/status.h> | 
 |  | 
 | #include <iomanip> | 
 | #include <string_view> | 
 |  | 
 | #include "base/location.h" | 
 | #include "base/process/process.h" | 
 | #include "base/scoped_clear_last_error.h" | 
 | #include "base/strings/stringprintf.h" | 
 |  | 
 | namespace logging { | 
 |  | 
 | ZxLogMessage::ZxLogMessage(const char* file_path, | 
 |                            int line, | 
 |                            LogSeverity severity, | 
 |                            zx_status_t zx_status) | 
 |     : LogMessage(file_path, line, severity), zx_status_(zx_status) {} | 
 |  | 
 | ZxLogMessage::~ZxLogMessage() { | 
 |   AppendError(); | 
 | } | 
 |  | 
 | void ZxLogMessage::AppendError() { | 
 |   // Don't let actions from this method affect the system error after returning. | 
 |   base::ScopedClearLastError scoped_clear_last_error; | 
 |  | 
 |   // zx_status_t error values are negative, so log the numeric version as | 
 |   // decimal rather than hex. This is also useful to match zircon/errors.h for | 
 |   // grepping. | 
 |   stream() << ": " << zx_status_get_string(zx_status_) << " (" << zx_status_ | 
 |            << ")"; | 
 | } | 
 |  | 
 | ZxLogMessageFatal::~ZxLogMessageFatal() { | 
 |   AppendError(); | 
 |   Flush(); | 
 |   base::ImmediateCrash(); | 
 | } | 
 |  | 
 | }  // namespace logging | 
 |  | 
 | namespace base { | 
 |  | 
 | namespace internal { | 
 |  | 
 | std::string FidlConnectionErrorMessage(std::string_view protocol_name, | 
 |                                        std::string_view status_string) { | 
 |   return base::StringPrintf("Failed to connect to %s: %s", protocol_name.data(), | 
 |                             status_string.data()); | 
 | } | 
 |  | 
 | std::string FidlMethodResultErrorMessage(std::string_view formatted_error, | 
 |                                          std::string_view method_name) { | 
 |   return base::StringPrintf("Error calling %s: %s", method_name.data(), | 
 |                             formatted_error.data()); | 
 | } | 
 |  | 
 | }  // namespace internal | 
 |  | 
 | fit::function<void(zx_status_t)> LogFidlErrorAndExitProcess( | 
 |     const Location& from_here, | 
 |     std::string_view protocol_name) { | 
 |   return [from_here, protocol_name](zx_status_t status) { | 
 |     { | 
 |       logging::ZxLogMessage(from_here.file_name(), from_here.line_number(), | 
 |                             logging::LOGGING_ERROR, status) | 
 |               .stream() | 
 |           << protocol_name << " disconnected unexpectedly, exiting"; | 
 |     } | 
 |     base::Process::TerminateCurrentProcessImmediately(1); | 
 |   }; | 
 | } | 
 |  | 
 | std::string FidlMethodResultErrorMessage( | 
 |     const fit::result<fidl::OneWayError>& result, | 
 |     std::string_view method_name) { | 
 |   CHECK(result.is_error()); | 
 |   return internal::FidlMethodResultErrorMessage( | 
 |       result.error_value().FormatDescription(), method_name); | 
 | } | 
 |  | 
 | fit::function<void(fidl::UnbindInfo)> FidlBindingClosureWarningLogger( | 
 |     std::string_view protocol_name) { | 
 |   return [protocol_name](fidl::UnbindInfo info) { | 
 |     ZX_LOG(WARNING, info.status()) << protocol_name << " unbound"; | 
 |   }; | 
 | } | 
 |  | 
 | }  // namespace base |