dynamic_string uint64_to_string_with_commas(uint64_t value) { const uint32_t cBufSize = 32; char buf[cBufSize]; uint64_to_string_with_commas(value, buf, sizeof(buf)); return dynamic_string(buf); }
bool vogl_trace_file_writer::close() { VOGL_FUNC_TRACER vogl_debug_printf("%s\n", VOGL_METHOD_NAME); if (!m_stream.is_opened()) return false; vogl_message_printf("%s: Flushing trace file %s (this could take some time), %u total frame file offsets\n", VOGL_METHOD_NAME, m_filename.get_ptr(), m_frame_file_offsets.size()); bool success = true; dynamic_string trace_archive_filename; if (!write_eof_packet()) { vogl_error_printf("%s: Failed writing to trace file \"%s\"\n", VOGL_METHOD_NAME, m_filename.get_ptr()); success = false; } else if (m_pTrace_archive.get()) { trace_archive_filename = m_pTrace_archive->get_archive_filename(); if ((!write_frame_file_offsets_to_archive()) || !m_pTrace_archive->deinit()) { vogl_error_printf("%s: Failed closing trace archive \"%s\"!\n", VOGL_FUNCTION_NAME, trace_archive_filename.get_ptr()); success = false; } else { if (!file_utils::get_file_size(trace_archive_filename.get_ptr(), m_sof_packet.m_archive_size)) { vogl_error_printf("%s: Failed determining file size of archive file \"%s\"\n", VOGL_FUNCTION_NAME, trace_archive_filename.get_ptr()); success = false; } else if (m_sof_packet.m_archive_size) { m_sof_packet.m_archive_offset = m_stream.get_size(); vogl_message_printf("Copying %" PRIu64 " archive bytes into output trace file\n", m_sof_packet.m_archive_size); if (!m_stream.write_file_data(trace_archive_filename.get_ptr())) { vogl_error_printf("%s: Failed copying source archive \"%s\" into trace file!\n", VOGL_METHOD_NAME, trace_archive_filename.get_ptr()); success = false; } m_sof_packet.m_archive_size = m_stream.get_size() - m_sof_packet.m_archive_offset; } } if (success) { m_sof_packet.finalize(); VOGL_VERIFY(m_sof_packet.full_validation(sizeof(m_sof_packet))); if (!m_stream.seek(0, false) || (m_stream.write(&m_sof_packet, sizeof(m_sof_packet)) != sizeof(m_sof_packet))) { vogl_error_printf("%s: Failed writing to trace file \"%s\"\n", VOGL_METHOD_NAME, m_filename.get_ptr()); success = false; } } } close_archive(trace_archive_filename.get_ptr()); uint64_t total_trace_file_size = m_stream.get_size(); if (!m_stream.close()) { vogl_error_printf("Failed writing to or closing trace file!\n"); success = false; } dynamic_string full_trace_filename(m_filename); file_utils::full_path(full_trace_filename); if (success) vogl_message_printf("%s: Successfully closed trace file %s, total file size: %s\n", VOGL_METHOD_NAME, full_trace_filename.get_ptr(), uint64_to_string_with_commas(total_trace_file_size).get_ptr()); else vogl_error_printf("%s: Failed closing trace file %s! (Trace will probably not be valid.)\n", VOGL_METHOD_NAME, full_trace_filename.get_ptr()); return success; }