1#include <muda/atomic.h>
5MUDA_INLINE MUDA_DEVICE LogProxy::LogProxy(LoggerViewer& viewer)
8 MUDA_KERNEL_ASSERT(m_viewer->m_buffer && m_viewer->m_meta_data,
9 "LoggerViewer is not initialized");
10 m_log_id = atomic_add(&(m_viewer->m_offset->log_id), 1u);
13MUDA_INLINE MUDA_DEVICE LogProxy& LogProxy::push_string(
const char* str)
15 auto strlen = [](
const char* s)
22 auto size = strlen(str) + 1;
24 details::LoggerMetaData meta;
27 meta.type = LoggerBasicType::FmtString;
31 meta.type = LoggerBasicType::String;
35 m_viewer->push_data(meta, str);
40MUDA_DEVICE
void LogProxy::push_fmt_arg(
const T& obj, LoggerFmtArg func)
42 details::LoggerMetaData meta;
43 meta.type = LoggerBasicType::Object;
44 meta.size =
sizeof(T);
47 m_viewer->push_data(meta, &obj);
50MUDA_INLINE MUDA_DEVICE
bool LogProxy::push_data(
const details::LoggerMetaData& meta,
53 return m_viewer->push_data(meta, data);
56MUDA_INLINE MUDA_DEVICE LogProxy& LogProxy::operator<<(
const char* str)
58 return push_string<false>(str);
62MUDA_INLINE MUDA_DEVICE LogProxy LoggerViewer::operator<<(
const T& t)
64 auto p = LogProxy(*
this);
70MUDA_INLINE MUDA_DEVICE LogProxy LoggerViewer::push_string(
const char* str)
72 auto p = LogProxy(*
this);
73 p.push_string<IsFmt>(str);
77MUDA_INLINE MUDA_DEVICE LogProxy LoggerViewer::operator<<(
const char* s)
79 auto p = LogProxy(*
this);
84MUDA_INLINE MUDA_DEVICE uint32_t next_idx(uint32_t* data_offset, uint32_t size, uint32_t total_size)
87 uint32_t old = *data_offset;
88 if(old + size >= total_size)
94 auto new_offset = old + size;
95 old = atomic_cas(data_offset, assumed, new_offset);
96 if(old + size >= total_size)
101 }
while(assumed != old);
105MUDA_INLINE MUDA_DEVICE uint32_t LoggerViewer::next_meta_data_idx()
const
107 auto idx = next_idx(&(m_offset->meta_data_offset), 1u, m_meta_data_size);
110 atomic_cas(&(m_offset->exceed_meta_data), 0u, 1u);
116MUDA_INLINE MUDA_DEVICE uint32_t LoggerViewer::next_buffer_idx(uint32_t size)
const
118 auto idx = next_idx(&(m_offset->buffer_offset), size, m_buffer_size);
121 atomic_cas(&(m_offset->exceed_buffer), 0u, 1u);
127MUDA_INLINE MUDA_DEVICE
bool LoggerViewer::push_data(details::LoggerMetaData meta,
130 auto meta_idx = next_meta_data_idx();
133 MUDA_KERNEL_WARN_WITH_LOCATION(
134 "LoggerViewer: meta data is exceeded, "
135 "the content[id=%d] will be discarded.",
139 auto buffer_idx = next_buffer_idx(meta.size);
140 if(buffer_idx == ~0u)
142 meta.exceeded =
true;
143 MUDA_KERNEL_WARN_WITH_LOCATION(
144 "LoggerViewer: log buffer is exceeded, "
145 "the content[id=%d] will be discarded.",
148 m_meta_data[meta_idx] = meta;
149 m_meta_data_id[meta_idx] = meta.id;
152 meta.offset = buffer_idx;
153 m_meta_data[meta_idx] = meta;
154 m_meta_data_id[meta_idx] = meta.id;
155 for(
int i = 0; i < meta.size; ++i)
156 m_buffer[buffer_idx + i] =
reinterpret_cast<const char*
>(data)[i];