ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
session_log_buffer.c File Reference

Go to the source code of this file.

Data Structures

struct  session_log_buffer
 Internal circular buffer structure. More...
 

Typedefs

typedef struct session_log_buffer session_log_buffer_t
 Internal circular buffer structure.
 

Functions

session_log_buffer_t * session_log_buffer_create (void)
 Create a new session log buffer instance.
 
void session_log_buffer_destroy (session_log_buffer_t *buf)
 Cleanup session log buffer instance.
 
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.
 

Typedef Documentation

◆ session_log_buffer_t

Internal circular buffer structure.

Function Documentation

◆ session_log_buffer_append()

void session_log_buffer_append ( session_log_buffer_t *  buf,
const char *  message 
)

Append a log message to the buffer.

Thread-safe. Called from logging system to capture messages. Message is copied into circular buffer (oldest entry overwritten if full).

Parameters
bufBuffer instance (must not be NULL)
messageLog message text (already formatted with colors)

Definition at line 65 of file session_log_buffer.c.

65 {
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}
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
#define SAFE_STRNCPY(dst, src, size)
Definition common.h:414
unsigned long long uint64_t
Definition common.h:59
#define mutex_lock(mutex)
Lock a mutex (with debug tracking in debug builds)
#define mutex_unlock(mutex)
Unlock a mutex (with debug tracking in debug builds)
session_log_entry_t entries[SESSION_LOG_BUFFER_SIZE]
char message[1024]
Formatted log message (may include ANSI colors)
uint64_t sequence
Sequence number (monotonic, for ordering)

References atomic_fetch_add_u64(), atomic_load_u64(), atomic_store_u64(), session_log_buffer::entries, session_log_entry_t::message, session_log_buffer::mutex, mutex_lock, mutex_unlock, SAFE_STRNCPY, session_log_entry_t::sequence, session_log_buffer::sequence, SESSION_LOG_BUFFER_SIZE, SESSION_LOG_LINE_MAX, and session_log_buffer::write_pos.

◆ session_log_buffer_clear()

void session_log_buffer_clear ( session_log_buffer_t *  buf)

Clear all log entries from buffer.

Thread-safe. Resets buffer to empty state, discarding all captured logs. Useful for clearing initialization logs before screen starts rendering.

Parameters
bufBuffer instance (must not be NULL)

Definition at line 45 of file session_log_buffer.c.

45 {
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}

References atomic_store_u64(), session_log_buffer::entries, session_log_entry_t::message, session_log_buffer::mutex, mutex_lock, mutex_unlock, session_log_entry_t::sequence, session_log_buffer::sequence, SESSION_LOG_BUFFER_SIZE, and session_log_buffer::write_pos.

◆ session_log_buffer_create()

session_log_buffer_t * session_log_buffer_create ( void  )

Create a new session log buffer instance.

Allocates and initializes a circular buffer for log capture. Caller is responsible for calling session_log_buffer_destroy() when done.

Returns
Pointer to new buffer instance, or NULL on allocation failure

Definition at line 23 of file session_log_buffer.c.

23 {
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}
#define SAFE_CALLOC(count, size, cast)
Definition common.h:274
int mutex_init(mutex_t *mutex, const char *name)
Initialize a mutex with a name.
Definition threading.c:16
Internal circular buffer structure.

References atomic_store_u64(), session_log_buffer::mutex, mutex_init(), SAFE_CALLOC, session_log_buffer::sequence, and session_log_buffer::write_pos.

◆ session_log_buffer_destroy()

void session_log_buffer_destroy ( session_log_buffer_t *  buf)

Cleanup session log buffer instance.

Frees the buffer and all internal resources. Safe to call with NULL.

Parameters
bufBuffer instance to destroy (can be NULL)

Definition at line 36 of file session_log_buffer.c.

36 {
37 if (!buf) {
38 return;
39 }
40
41 mutex_destroy(&buf->mutex);
42 SAFE_FREE(buf);
43}
#define SAFE_FREE(ptr)
Definition common.h:376
int mutex_destroy(mutex_t *mutex)
Destroy a mutex.
Definition threading.c:22

References session_log_buffer::mutex, mutex_destroy(), and SAFE_FREE.

◆ session_log_buffer_get_recent()

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.

Thread-safe. Copies up to max_count recent entries into out_entries. Entries are returned in chronological order (oldest first).

Parameters
bufBuffer instance (must not be NULL)
out_entriesOutput array to fill with log entries
max_countMaximum number of entries to return
Returns
Number of entries actually copied (may be less than max_count)

Definition at line 85 of file session_log_buffer.c.

85 {
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}
atomic_t write_pos
Definition mmap.c:37
Single log entry with sequence number for ordering.

References atomic_load_u64(), session_log_buffer::entries, session_log_buffer::mutex, mutex_lock, mutex_unlock, session_log_entry_t::sequence, session_log_buffer::sequence, SESSION_LOG_BUFFER_SIZE, write_pos, and session_log_buffer::write_pos.