cwist
Modern C web framework with libttak runtime
Loading...
Searching...
No Matches
session_manager.c
Go to the documentation of this file.
3#include <stdlib.h>
4#include <string.h>
5
17void session_arena_init(struct session_arena *arena, uint8_t *buffer, size_t capacity) {
18 if (!arena) return;
19 arena->buffer = buffer;
20 arena->capacity = capacity;
21 arena->offset = 0;
22}
23
30void *session_arena_alloc(struct session_arena *arena, size_t size) {
31 if (!arena || !arena->buffer) return NULL;
32 if (size > SIZE_MAX - 7u) return NULL;
33 size = (size + 7u) & ~7u;
34 if (size > arena->capacity - arena->offset) {
35 return NULL;
36 }
37 void *ptr = arena->buffer + arena->offset;
38 arena->offset += size;
39 return ptr;
40}
41
47 if (!arena) return;
48 arena->offset = 0;
49}
50
56void session_rc_init(struct session_rc_header *header, void (*destructor)(void *)) {
57 if (!header) return;
58 header->ref_count = 1;
59 header->destructor = destructor;
60}
61
68void *session_shared_alloc(size_t payload_size, void (*destructor)(void *)) {
69 if (payload_size > SIZE_MAX - sizeof(struct session_rc_header)) return NULL;
70 size_t total = sizeof(struct session_rc_header) + payload_size;
71 uint8_t *raw = (uint8_t *)cwist_alloc(total);
72 if (!raw) return NULL;
73 struct session_rc_header *header = (struct session_rc_header *)raw;
75 void *payload = raw + sizeof(struct session_rc_header);
76 memset(payload, 0, payload_size);
77 return payload;
78}
79
84void session_shared_inc(void *payload) {
85 if (!payload) return;
86 struct session_rc_header *header =
87 (struct session_rc_header *)((uint8_t *)payload - sizeof(struct session_rc_header));
88 if (header->ref_count == 0 || header->ref_count == UINT32_MAX) return;
89 header->ref_count += 1;
90}
91
96void session_shared_dec(void *payload) {
97 if (!payload) return;
98 struct session_rc_header *header =
99 (struct session_rc_header *)((uint8_t *)payload - sizeof(struct session_rc_header));
100 if (header->ref_count == 0) return;
101 header->ref_count -= 1;
102 if (header->ref_count == 0) {
103 if (header->destructor) {
104 header->destructor(payload);
105 }
106 cwist_free(header);
107 }
108}
109
116void session_manager_init(struct session_manager *manager, uint8_t *buffer, size_t capacity) {
117 if (!manager) return;
118 session_arena_init(&manager->request_arena, buffer, capacity);
119}
120
126 if (!manager) return;
127 session_arena_reset(&manager->request_arena);
128}
Memory allocation wrappers backed by libttak.
void cwist_free(void *ptr)
Free memory obtained via cwist_alloc/cwist_strdup/etc.
Definition alloc.c:52
void * cwist_alloc(size_t size)
Allocate zeroed memory tracked by libttak.
Definition alloc.c:17
size_t cap
Definition otel.c:56
void session_arena_init(struct session_arena *arena, uint8_t *buffer, size_t capacity)
Initialize a linear arena over caller-provided storage.
void session_shared_dec(void *payload)
Drop a reference and destroy the payload when the count reaches zero.
void session_manager_reset(struct session_manager *manager)
Reset all request-scoped allocations owned by the manager.
void * session_shared_alloc(size_t payload_size, void(*destructor)(void *))
Allocate a shared payload with an in-band reference-count header.
void session_arena_reset(struct session_arena *arena)
Rewind the arena so subsequent allocations reuse the full buffer.
void * session_arena_alloc(struct session_arena *arena, size_t size)
Allocate aligned bytes from the request arena.
void session_shared_inc(void *payload)
Increment the reference count for a shared payload.
void session_manager_init(struct session_manager *manager, uint8_t *buffer, size_t capacity)
Initialize the request-scoped allocator state for a session manager.
void session_rc_init(struct session_rc_header *header, void(*destructor)(void *))
Initialize the reference-count metadata for a shared payload.
Linear arena used for fast request-lifetime allocations.
Top-level session allocator state owned by a request context.
Reference-count header placed immediately before shared session payloads.
void(* destructor)(void *)
Request-scoped arena and shared-payload helpers for session data.