71 if (!g_log_buffer || !message) {
77 mutex_lock(&g_log_buffer->
mutex);
79 size_t pos = atomic_load(&g_log_buffer->
write_pos);
80 uint64_t seq = atomic_fetch_add(&g_log_buffer->
sequence, 1);
82 SAFE_STRNCPY(g_log_buffer->
entries[pos].message, message, SESSION_LOG_LINE_MAX);
83 g_log_buffer->
entries[pos].sequence = seq;
85 atomic_store(&g_log_buffer->
write_pos, (pos + 1) % SESSION_LOG_BUFFER_SIZE);
87 mutex_unlock(&g_log_buffer->
mutex);
91 if (!g_log_buffer || !out_entries || max_count == 0) {
97 mutex_lock(&g_log_buffer->
mutex);
100 uint64_t total_entries = atomic_load(&g_log_buffer->
sequence);
103 size_t entries_to_check = SESSION_LOG_BUFFER_SIZE;
105 if (total_entries < SESSION_LOG_BUFFER_SIZE) {
111 for (
size_t i = 0; i < entries_to_check && count < max_count; i++) {
112 size_t idx = (start_pos + i) % SESSION_LOG_BUFFER_SIZE;
113 if (g_log_buffer->
entries[idx].sequence > 0) {
114 memcpy(&out_entries[count], &g_log_buffer->
entries[idx],
sizeof(session_log_entry_t));
119 mutex_unlock(&g_log_buffer->
mutex);