// Copyright 2024 The Pigweed Authors // // Licensed under the Apache License, Version 2.0 (the "License"); you may not // use this file except in compliance with the License. You may obtain a copy of // the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations under // the License. #include #include "pw_assert_trap/config.h" #include "pw_assert_trap/handler.h" #include "pw_assert_trap/message.h" #include "pw_string/string_builder.h" #include "pw_sync/interrupt_spin_lock.h" static pw::sync::InterruptSpinLock interrupt_spin_lock; PW_CONSTINIT static pw::InlineString message_buffer; const std::string_view pw_assert_trap_get_message() { return message_buffer; } void pw_assert_trap_clear_message() { message_buffer.clear(); } void pw_assert_trap_interrupt_lock(void) { interrupt_spin_lock.lock(); } void pw_assert_trap_interrupt_unlock(void) { interrupt_spin_lock.unlock(); } void pw_assert_trap_HandleAssertFailure( [[maybe_unused]] const char* file_name, [[maybe_unused]] int line_number, [[maybe_unused]] const char* function_name) { pw::StringBuilder builder(message_buffer); builder.append("PW_ASSERT() or PW_DASSERT() failure"); #if !PW_ASSERT_TRAP_DISABLE_LOCATION_CAPTURE builder.append(" at "); if (file_name != nullptr && line_number != -1) { builder.Format("%s:%d", file_name, line_number); } if (function_name != nullptr) { builder.Format(" %s: ", function_name); } #endif // !PW_ASSERT_TRAP_DISABLE_LOCATION_CAPTURE } void pw_assert_trap_HandleCheckFailure( [[maybe_unused]] const char* file_name, [[maybe_unused]] int line_number, [[maybe_unused]] const char* function_name, const char* format, ...) { pw::StringBuilder builder(message_buffer); #if !PW_ASSERT_TRAP_DISABLE_LOCATION_CAPTURE if (file_name != nullptr && line_number != -1) { builder.Format("%s:%d", file_name, line_number); } if (function_name != nullptr) { builder.Format(" %s: ", function_name); } #endif // !PW_ASSERT_TRAP_DISABLE_LOCATION_CAPTURE va_list args; va_start(args, format); builder.FormatVaList(format, args); va_end(args); }