ascii-chat 0.11.33
Video chat in your terminal
Loading...
Searching...
No Matches
debug/named.h
Go to the documentation of this file.
1#pragma once
2
46#include <stdint.h>
47#include <stdbool.h>
48
49#ifdef __cplusplus
50extern "C" {
51#endif
52
53#include "../platform/thread.h"
54
55// ============================================================================
56// Core Registry API
57// ============================================================================
58
68
76void named_destroy(void);
77
99const char *named_register(uintptr_t key, const char *base_name, const char *type, const char *format_spec,
100 const char *file, int line, const char *func, uintptr_t parent_key);
101
123const char *named_register_fmt(uintptr_t key, const char *type, const char *format_spec, const char *file, int line,
124 const char *func, const char *fmt, ...);
125
134void named_unregister(uintptr_t key);
135
149const char *named_update_name(uintptr_t key, const char *new_base_name);
150
162const char *named_get(uintptr_t key);
163
175const char *named_get_type(uintptr_t key);
176
188const char *named_get_format_spec(uintptr_t key);
189
204const char *named_register_fd(int fd, const char *name, const char *file, int line, const char *func);
205
215const char *named_get_fd(int fd);
216
223const char *named_get_fd_format_spec(int fd);
224
238const char *named_register_packet_type(int pkt_type, const char *file, int line, const char *func);
239
249const char *named_get_packet_type(int pkt_type);
250
257const char *named_get_packet_type_format_spec(int pkt_type);
258
271const char *named_get_by_type_and_id(const char *type_name, size_t type_len, int id);
272
287const char *named_describe(uintptr_t key, const char *type_hint);
288
301
302// ============================================================================
303// Convenience Macros — Pointer-based Registration
304// ============================================================================
305
317#define NAMED_REGISTER(ptr, name, type, fmt, parent_ptr) \
318 named_register((uintptr_t)(const void *)(ptr), (name), (type), (fmt), __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
319
332#define NAMED_REGISTER_FMT(ptr, type, fmt_spec, fmt, ...) \
333 named_register_fmt((uintptr_t)(const void *)(ptr), (type), (fmt_spec), __FILE__, __LINE__, __func__, (fmt), \
334 __VA_ARGS__)
335
341#define NAMED_UNREGISTER(ptr) named_unregister((uintptr_t)(const void *)(ptr))
342
348#define NAMED_GET(ptr) named_get((uintptr_t)(const void *)(ptr))
349
356#define NAMED_DESCRIBE(ptr, hint) named_describe((uintptr_t)(const void *)(ptr), (hint))
357
358// ============================================================================
359// Convenience Macros — Integer Handle Registration
360// ============================================================================
361
372#define NAMED_REGISTER_ID(id, name, type, fmt, parent_ptr) \
373 named_register((uintptr_t)(intptr_t)(id), (name), (type), (fmt), __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
374
380#define NAMED_UNREGISTER_ID(id) named_unregister((uintptr_t)(intptr_t)(id))
381
388#define NAMED_DESCRIBE_ID(id, hint) named_describe((uintptr_t)(intptr_t)(id), (hint))
389
390// ============================================================================
391// Type-Specific Convenience Macros (Mutex, RWLock, Cond, Thread)
392// ============================================================================
393
402#define NAMED_REGISTER_MUTEX(mutex, name, parent_ptr) \
403 named_register((uintptr_t)(const void *)(mutex), (name), "mutex", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
404
413#ifndef NDEBUG
414#define NAMED_REGISTER_RWLOCK(lock, name, parent_ptr) \
415 named_register((uintptr_t)(const void *)(lock), (name), "rwlock", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
416#else
417#define NAMED_REGISTER_RWLOCK(lock, name, parent_ptr) ((void)(lock), (void)(parent_ptr), (name))
418#endif
419
428#define NAMED_REGISTER_COND(cond, name, parent_ptr) \
429 named_register((uintptr_t)(const void *)(cond), (name), "cond", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
430
439#define NAMED_REGISTER_SOCKET(socket, name, parent_ptr) \
440 named_register((uintptr_t)(intptr_t)(socket), (name), "socket", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
441#define NAMED_UNREGISTER_SOCKET(socket) NAMED_UNREGISTER_ID((socket))
442
451#define NAMED_REGISTER_WEBSOCKET(websocket, name, parent_ptr) \
452 named_register((uintptr_t)(const void *)(websocket), (name), "websocket", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
453
462#define NAMED_REGISTER_DATACHANNEL(datachannel, name, parent_ptr) \
463 named_register((uintptr_t)(const void *)(datachannel), (name), "datachannel", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
464
473#define NAMED_REGISTER_THREADPOOL_WORK(work, name, parent_ptr) \
474 named_register((uintptr_t)(const void *)(work), (name), "work", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
475
484#define NAMED_REGISTER_CLIENT(client, name, parent_ptr) \
485 named_register((uintptr_t)(const void *)(client), (name), "client", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
486
495#define NAMED_REGISTER_CRYPTO_CONTEXT(ctx, name, parent_ptr) \
496 named_register((uintptr_t)(const void *)(ctx), (name), "crypto", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
497
506#define NAMED_REGISTER_TRANSPORT(transport, name, parent_ptr) \
507 named_register((uintptr_t)(const void *)(transport), (name), "transport", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
508
517#define NAMED_REGISTER_FRAME_BUFFER(buf, name, parent_ptr) \
518 named_register((uintptr_t)(const void *)(buf), (name), "frame_buffer", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
519
528#define NAMED_REGISTER_PACKET_QUEUE(queue, name, parent_ptr) \
529 named_register((uintptr_t)(const void *)(queue), (name), "packet_queue", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
530
539#define NAMED_REGISTER_AUDIO_RINGBUF(buf, name, parent_ptr) \
540 named_register((uintptr_t)(const void *)(buf), (name), "audio_ringbuf", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
541
550#define NAMED_REGISTER_MIXER(mixer, name, parent_ptr) \
551 named_register((uintptr_t)(const void *)(mixer), (name), "mixer", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
552
561#define NAMED_REGISTER_AUDIO_CODEC(codec, name, parent_ptr) \
562 named_register((uintptr_t)(const void *)(codec), (name), "audio_codec", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
563
572#define NAMED_REGISTER_VIDEO_ENCODER(encoder, name, parent_ptr) \
573 named_register((uintptr_t)(const void *)(encoder), (name), "video_encoder", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
574
583#define NAMED_REGISTER_BUFFER_POOL(pool, name, parent_ptr) \
584 named_register((uintptr_t)(const void *)(pool), (name), "buffer_pool", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
585
594#define NAMED_REGISTER_FFMPEG_DECODER(decoder, name, parent_ptr) \
595 named_register((uintptr_t)(const void *)(decoder), (name), "ffmpeg_decoder", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
596
606#define NAMED_REGISTER_FFMPEG_ENCODER(encoder, name, parent_ptr) \
607 named_register((uintptr_t)(const void *)(encoder), (name), "ffmpeg_encoder", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
608
618#define NAMED_REGISTER_H265_ENCODER(encoder, name, parent_ptr) \
619 named_register((uintptr_t)(const void *)(encoder), (name), "h265_encoder", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
620
630#define NAMED_REGISTER_H265_DECODER(decoder, name, parent_ptr) \
631 named_register((uintptr_t)(const void *)(decoder), (name), "h265_decoder", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
632
641#define NAMED_REGISTER_AUDIO_CONTEXT(ctx, name, parent_ptr) \
642 named_register((uintptr_t)(const void *)(ctx), (name), "audio_context", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
643
652#define NAMED_REGISTER_RATE_LIMITER(limiter, name, parent_ptr) \
653 named_register((uintptr_t)(const void *)(limiter), (name), "rate_limiter", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
654
663#define NAMED_REGISTER_WAV_WRITER(writer, name, parent_ptr) \
664 named_register((uintptr_t)(const void *)(writer), (name), "wav_writer", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
665
674#define NAMED_REGISTER_MEDIA_SOURCE(source, name, parent_ptr) \
675 named_register((uintptr_t)(const void *)(source), (name), "media_source", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
676
692#define NAMED_OPEN(pathname, name, flags, ...) \
693 ({ \
694 int _fd; \
695 if ((flags) & O_CREAT) { \
696 _fd = platform_open((pathname), (flags), __VA_ARGS__); \
697 } else { \
698 _fd = platform_open((pathname), (flags)); \
699 } \
700 if (_fd >= 0) { \
701 named_register_fd(_fd, NULL, __FILE__, __LINE__, __func__); \
702 } \
703 _fd; \
704 })
705
713#define NAMED_UNREGISTER_FD(fd) NAMED_UNREGISTER_ID((fd))
714
725#define NAMED_REGISTER_FD(fd, name) named_register_fd((fd), (name), __FILE__, __LINE__, __func__)
726
735#define NAMED_REGISTER_ATOMIC(a, name, parent_ptr) \
736 named_register((uintptr_t)(const void *)(a), (name), "atomic", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
737
746#define NAMED_REGISTER_ATOMIC_PTR(a, name, parent_ptr) \
747 named_register((uintptr_t)(const void *)(a), (name), "atomic_ptr", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
748
749// ============================================================================
750// Thread-Specific Registration Macros
751// ============================================================================
752
764#define NAMED_REGISTER_THREAD(thread, name, parent_ptr) \
765 named_register(asciichat_thread_to_key((thread)), (name), "thread", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
766
772#define NAMED_UNREGISTER_THREAD(thread) named_unregister(asciichat_thread_to_key((thread)))
773
774// ============================================================================
775// Type-Specific Description Macros
776// ============================================================================
777
791#define NAME_DESCRIBE_MUTEX(m) named_describe((uintptr_t)(const void *)(m), "mutex")
792
798#define NAME_DESCRIBE_RWLOCK(l) named_describe((uintptr_t)(const void *)(l), "rwlock")
799
805#define NAME_DESCRIBE_COND(c) named_describe((uintptr_t)(const void *)(c), "cond")
806
814#define NAME_DESCRIBE_THREAD(t) named_describe_thread(t)
815
821#define NAME_DESCRIBE_TRANSPORT(tr) named_describe((uintptr_t)(const void *)(tr), "transport")
822
828#define NAME_DESCRIBE_SOCKET(fd) named_describe((uintptr_t)(intptr_t)(fd), "socket")
829
835#define NAME_DESCRIBE_RINGBUF(rb) named_describe((uintptr_t)(const void *)(rb), "ringbuf")
836
/* Type-Specific Description Macros */
838
839// ============================================================================
840// Thread-Specific Description Function
841// ============================================================================
842
852const char *named_describe_thread(void *thread);
853
854// ============================================================================
855// Registry Iteration
856// ============================================================================
857
868typedef void (*named_iter_callback_t)(uintptr_t key, const char *name, void *user_data);
869
876#define NAMED_REGISTER_TCP_CLIENT(client, name, parent_ptr) \
877 named_register((uintptr_t)(const void *)(client), (name), "tcp_client", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
878
885#define NAMED_REGISTER_WEBSOCKET_CLIENT(client, name, parent_ptr) \
886 named_register((uintptr_t)(const void *)(client), (name), "websocket_client", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
887
894#define NAMED_REGISTER_APP_CLIENT(client, name, parent_ptr) \
895 named_register((uintptr_t)(const void *)(client), (name), "app_client", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
896
903#define NAMED_REGISTER_VIDEO_FRAME_BUFFER(buf, name, parent_ptr) \
904 named_register((uintptr_t)(const void *)(buf), (name), "video_frame_buffer", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
905
912#define NAMED_REGISTER_NODE_POOL(pool, name, parent_ptr) \
913 named_register((uintptr_t)(const void *)(pool), (name), "node_pool", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
914
921#define NAMED_REGISTER_THREAD_POOL(pool, name, parent_ptr) \
922 named_register((uintptr_t)(const void *)(pool), (name), "thread_pool", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
923
930#define NAMED_REGISTER_OPTIONS_BUILDER(builder, name, parent_ptr) \
931 named_register((uintptr_t)(const void *)(builder), (name), "options_builder", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
932
939#define NAMED_REGISTER_SIMPLE_FRAME_SWAP(swap, name, parent_ptr) \
940 named_register((uintptr_t)(const void *)(swap), (name), "simple_frame_swap", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
941
948#define NAMED_REGISTER_CLIENT_AUDIO_PIPELINE(pipeline, name, parent_ptr) \
949 named_register((uintptr_t)(const void *)(pipeline), (name), "client_audio_pipeline", "0x%tx", __FILE__, __LINE__, \
950 __func__, (uintptr_t)(const void *)(parent_ptr))
951
952#ifdef DEBUG_MEMORY
953#define NAMED_REGISTER_WEBSOCKET_IMPL(data, name, parent_ptr) \
954 named_register((uintptr_t)(const void *)(data), (name), "websocket_impl", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
955#else
956#define NAMED_REGISTER_WEBSOCKET_IMPL(data, name, parent_ptr) ((void)(data), (void)(name), (void)(parent_ptr))
957#endif
958
969
980void named_registry_for_each(named_iter_callback_t callback, void *user_data);
981
991#define NAMED_REGISTER_LWS_CONTEXT(context, name, parent_ptr) \
992 named_register((uintptr_t)(const void *)(context), (name), "lws_context", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
993
1003#define NAMED_REGISTER_FFMPEG_CONTEXT(context, name, parent_ptr) \
1004 named_register((uintptr_t)(const void *)(context), (name), "ffmpeg_context", "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
1005
1016#define NAMED_REGISTER_CONTEXT(context, context_type, name, parent_ptr) \
1017 named_register((uintptr_t)(const void *)(context), (name), (context_type), "0x%tx", __FILE__, __LINE__, __func__, (uintptr_t)(const void *)(parent_ptr))
1018
1034#define NAMED_GET_BY_PTR(key, buffer, size) \
1035 do { \
1036 const char *_name = named_get(key); \
1037 if (_name) { \
1038 size_t _len = strlen(_name); \
1039 if (_len >= (size)) _len = (size) - 1; \
1040 memcpy((buffer), (_name), _len); \
1041 (buffer)[_len] = '\0'; \
1042 } else { \
1043 snprintf((buffer), (size), "0x%tx", (ptrdiff_t)(key)); \
1044 } \
1045 } while (0)
1046
1060#define NAMED_GET_BY_INT(id, buffer, size) \
1061 do { \
1062 const char *_name = named_get((uintptr_t)(id)); \
1063 if (_name) { \
1064 size_t _len = strlen(_name); \
1065 if (_len >= (size)) _len = (size) - 1; \
1066 memcpy((buffer), (_name), _len); \
1067 (buffer)[_len] = '\0'; \
1068 } else { \
1069 snprintf((buffer), (size), "0x%lx", (unsigned long)(id)); \
1070 } \
1071 } while (0)
1072
1085#define NAMED_GET_BY_STR(str, buffer, size) \
1086 do { \
1087 if ((str)) { \
1088 strncpy((buffer), (str), (size) - 1); \
1089 (buffer)[(size) - 1] = '\0'; \
1090 } else { \
1091 (buffer)[0] = '\0'; \
1092 } \
1093 } while (0)
1094
1095
1096#ifdef __cplusplus
1097}
1098#endif
1099
/* debug_named */
const char * named_get_fd(int fd)
Look up a registered file descriptor.
const char * named_get_packet_type_format_spec(int pkt_type)
Get the format specifier for a registered packet type.
void named_registry_for_each(named_iter_callback_t callback, void *user_data)
Iterate through all registered entries.
void named_destroy(void)
Destroy the named object registry.
const char * named_describe(uintptr_t key, const char *type_hint)
Format a description string for logging.
const char * named_get_packet_type(int pkt_type)
Look up a registered packet type.
const char * named_register_packet_type(int pkt_type, const char *file, int line, const char *func)
Register a packet type with namespace encoding.
const char * named_register_fd(int fd, const char *name, const char *file, int line, const char *func)
Register a file descriptor with namespace encoding.
const char * named_get_type(uintptr_t key)
Look up the registered type for a resource.
void named_unregister(uintptr_t key)
Unregister a resource by key.
void(* named_iter_callback_t)(uintptr_t key, const char *name, void *user_data)
Callback function for iterating registered entries.
const char * named_get_format_spec(uintptr_t key)
Get the format specifier for a registered named object.
void named_registry_register_packet_types(void)
Register all packet types from packet_type_t enum.
const char * named_get(uintptr_t key)
Look up the registered name for a resource.
const char * named_get_fd_format_spec(int fd)
Get the format specifier for a registered file descriptor.
asciichat_error_t named_init(void)
Initialize the named object registry.
Definition debug/named.c:89
const char * named_register(uintptr_t key, const char *base_name, const char *type, const char *format_spec, const char *file, int line, const char *func, uintptr_t parent_key)
Register a resource with an auto-suffixed name, type, and location info.
const char * named_get_by_type_and_id(const char *type_name, size_t type_len, int id)
Look up an integer ID by type name and value.
const char * named_describe_thread(void *thread)
Describe a thread for logging (function wrapper)
const char * named_register_fmt(uintptr_t key, const char *type, const char *format_spec, const char *file, int line, const char *func, const char *fmt,...)
Register a resource with a formatted name, type, and location info (no auto-suffix)
const char * named_update_name(uintptr_t key, const char *new_base_name)
Update the registered name for a resource with a new base name.
uintptr_t asciichat_thread_to_key(asciichat_thread_t thread)
Convert a thread handle to a registry key.
Definition threading.c:87
asciichat_error_t
Error and exit codes - unified status values (0-255)
Definition error_codes.h:49
void * asciichat_thread_t
ClangTool/LibTooling compatibility shim for stdbool.h.