| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "logging.h" |
| |
| #include <stdio.h> |
| #include <zircon/assert.h> |
| |
| #include <memory> |
| |
| #include <ddk/debug.h> |
| #include <fbl/string_printf.h> |
| |
| namespace sysmem_driver { |
| |
| void vLog(bool is_error, const char* prefix1, const char* prefix2, const char* format, |
| va_list args) { |
| // Let's not have a buffer on the stack, not because it couldn't be done |
| // safely, but because we'd potentially run into stack size vs. message |
| // length tradeoffs, stack expansion granularity fun, or whatever else. |
| |
| va_list args2; |
| va_copy(args2, args); |
| |
| size_t buffer_bytes = vsnprintf(nullptr, 0, format, args) + 1; |
| |
| std::unique_ptr<char[]> buffer(new char[buffer_bytes]); |
| |
| size_t buffer_bytes_2 = vsnprintf(buffer.get(), buffer_bytes, format, args2) + 1; |
| (void)buffer_bytes_2; |
| // sanity check; should match so go ahead and assert that it does. |
| ZX_DEBUG_ASSERT(buffer_bytes == buffer_bytes_2); |
| va_end(args2); |
| |
| if (is_error) { |
| zxlogf(ERROR, "[%s %s] %s", prefix1, prefix2, buffer.get()); |
| } else { |
| zxlogf(DEBUG, "[%s %s] %s", prefix1, prefix2, buffer.get()); |
| } |
| } |
| |
| static std::atomic_uint64_t name_counter; |
| |
| std::string CreateUniqueName(const char* prefix) { |
| uint64_t new_value = name_counter++; |
| return std::string(fbl::StringPrintf("%s%ld", prefix, new_value).c_str()); |
| } |
| } // namespace sysmem_driver |