ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
session_log_buffer.c
Go to the documentation of this file.
1
9#include <ascii-chat/common.h>
10#include <string.h>
11#include <ascii-chat/atomic.h>
12
22
25 if (!buf) {
26 return NULL;
27 }
28
30 atomic_store_u64(&buf->sequence, 0);
31 mutex_init(&buf->mutex, "log_buffer");
32
33 return buf;
34}
35
37 if (!buf) {
38 return;
39 }
40
41 mutex_destroy(&buf->mutex);
42 SAFE_FREE(buf);
43}
44
46 if (!buf) {
47 return;
48 }
49
50 mutex_lock(&buf->mutex);
51
52 // Reset write position and sequence
54 atomic_store_u64(&buf->sequence, 0);
55
56 // Clear all entries
57 for (size_t i = 0; i < SESSION_LOG_BUFFER_SIZE; i++) {
58 buf->entries[i].message[0] = '\0';
59 buf->entries[i].sequence = 0;
60 }
61
62 mutex_unlock(&buf->mutex);
63}
64
65void session_log_buffer_append(session_log_buffer_t *buf, const char *message) {
66 if (!buf || !message) {
67 // Fail silently - this is called FROM the logging system
68 // Using SET_ERRNO here would cause infinite recursion
69 return;
70 }
71
72 mutex_lock(&buf->mutex);
73
74 size_t pos = atomic_load_u64(&buf->write_pos);
76
78 buf->entries[pos].sequence = seq;
79
81
82 mutex_unlock(&buf->mutex);
83}
84
85size_t session_log_buffer_get_recent(session_log_buffer_t *buf, session_log_entry_t *out_entries, size_t max_count) {
86 if (!buf || !out_entries || max_count == 0) {
87 // Fail silently - called from display code that handles 0 gracefully
88 // Using SET_ERRNO here could cause recursion if error logging is enabled
89 return 0;
90 }
91
92 mutex_lock(&buf->mutex);
93
94 size_t write_pos = atomic_load_u64(&buf->write_pos);
95 uint64_t total_entries = atomic_load_u64(&buf->sequence);
96
97 size_t start_pos = write_pos;
98 size_t entries_to_check = SESSION_LOG_BUFFER_SIZE;
99
100 if (total_entries < SESSION_LOG_BUFFER_SIZE) {
101 start_pos = 0;
102 entries_to_check = write_pos;
103 }
104
105 size_t count = 0;
106 for (size_t i = 0; i < entries_to_check && count < max_count; i++) {
107 size_t idx = (start_pos + i) % SESSION_LOG_BUFFER_SIZE;
108 if (buf->entries[idx].sequence > 0) {
109 memcpy(&out_entries[count], &buf->entries[idx], sizeof(session_log_entry_t));
110 count++;
111 }
112 }
113
114 mutex_unlock(&buf->mutex);
115 return count;
116}
Platform abstraction layer umbrella header providing unified cross-platform API.
uint64_t atomic_fetch_add_u64(atomic_t *a, uint64_t delta)
Atomically add to a uint64_t and return the previous value.
Definition atomic.c:248
void atomic_store_u64(atomic_t *a, uint64_t value)
Atomically store a uint64_t value.
Definition atomic.c:241
uint64_t atomic_load_u64(atomic_t *a)
Atomically load a uint64_t value.
Definition atomic.c:233
⚛️ Atomic operations abstraction layer with debug tracking
⚙️ Common definitions, error codes, macros, and types shared throughout the application
🔍 Memory debugging helpers for tracking allocations in debug builds
#define SAFE_STRNCPY(dst, src, size)
Definition common.h:414
#define SAFE_FREE(ptr)
Definition common.h:376
#define SAFE_CALLOC(count, size, cast)
Definition common.h:274
unsigned long long uint64_t
Definition common.h:59
#define mutex_lock(mutex)
Lock a mutex (with debug tracking in debug builds)
int mutex_init(mutex_t *mutex, const char *name)
Initialize a mutex with a name.
Definition threading.c:16
#define mutex_unlock(mutex)
Unlock a mutex (with debug tracking in debug builds)
int mutex_destroy(mutex_t *mutex)
Destroy a mutex.
Definition threading.c:22
Thread-safe circular log buffer for session screens (status, splash)
atomic_t write_pos
Definition mmap.c:37
session_log_buffer_t * session_log_buffer_create(void)
Create a new session log buffer instance.
struct session_log_buffer session_log_buffer_t
Internal circular buffer structure.
void session_log_buffer_clear(session_log_buffer_t *buf)
Clear all log entries from buffer.
void session_log_buffer_append(session_log_buffer_t *buf, const char *message)
Append a log message to the buffer.
size_t session_log_buffer_get_recent(session_log_buffer_t *buf, session_log_entry_t *out_entries, size_t max_count)
Get recent log entries from buffer.
void session_log_buffer_destroy(session_log_buffer_t *buf)
Cleanup session log buffer instance.
Atomic value wrapper for integral/boolean types.
Definition atomic.h:76
Mutex type (POSIX: pthread_mutex_t with debug tracking)
Internal circular buffer structure.
session_log_entry_t entries[SESSION_LOG_BUFFER_SIZE]
Single log entry with sequence number for ordering.
char message[1024]
Formatted log message (may include ANSI colors)
uint64_t sequence
Sequence number (monotonic, for ordering)