21#if defined(__unix__) || defined(__APPLE__)
41 return "NOT_IMPLEMENTED";
43 return "SEQ_LIMIT_REACHED";
45 return "AL_LIMIT_REACHED";
47 return "SM_BUFFER_ID_EXHAUSTED";
49 return "INDEX_OUT_OF_BOUND";
51 return "CORRUPTED_SEQ";
53 return "CORRUPTED_ARRAY_LIST";
55 return "FAILED_TO_ADD_MODULE";
57 return "JIT_IR_PARSE_FAILED";
59 return "JIT_SYMBOL_NOT_FOUND";
61 return "JIT_SYMBOL_ALREADY_DEFINED";
63 return "EMPTY_NAMESPACE_NAME";
65 return "EMPTY_SYMBOL_NAME";
67 return "STRING_LENGTH_LIMIT_EXCEEDED";
71 return "EPOLL_INIT_FAILED";
73 return "EPOLL_EVENT_FD_FAILED";
75 return "EPOLL_FAILED_TO_ADD_FD";
77 return "CONNECTION_REFUSED";
79 return "CONNECTION_RESET";
81 return "CONNECTION_ABORTED";
85 return "BAD_DESCRIPTOR";
91 return "NOT_CONNECTED";
93 return "ADDRESS_IN_USE";
95 return "HOST_UNREACHABLE";
97 return "NETWORK_UNREACHABLE";
99 return "MESSAGE_TOO_LONG";
101 return "TOO_MANY_OPEN_FILES";
103 return "PERMISSION_DENIED";
105 return "OUT_OF_MEMORY";
109 return "ALREADY_EXISTS";
111 return "IS_A_DIRECTORY";
113 return "NOT_A_DIRECTORY";
117 return "INVALID_ARGUMENT";
119 return "CHANNEL_BUSY";
121 return "MEMORY_MAP_FAILED";
123 return "IR_PARSE_ERROR";
125 return "UNKNOWN_IO_ERROR";
136 const char *msg = err->
msg !=
nullptr ? err->
msg :
"<null>";
138 int header_len = snprintf(
nullptr, 0,
"[%s]: %s", tag, msg);
139 PANIC_IF(header_len < 0,
"srn_error_to_string: formatting failed");
149 if (name !=
nullptr) {
150 trace_len += snprintf(
nullptr, 0,
"\n #%u %p %s", i, addr, name);
152 trace_len += snprintf(
nullptr, 0,
"\n #%u %p", i, addr);
157 size_t total = (size_t)header_len + (
size_t)trace_len + 1;
161 int written = snprintf(buf,
total,
"[%s]: %s", tag, msg);
166 if (name !=
nullptr) {
167 written += snprintf(buf + written,
total - (
size_t)written,
"\n #%u %p %s", i, addr, name);
169 written += snprintf(buf + written,
total - (
size_t)written,
"\n #%u %p", i, addr);
201 err->
msg = (
char *)msg;
238#if defined(__unix__) || defined(__APPLE__)
240 switch (errno_value) {
289# error "srn_errno_to_tag has no errno mapping for this target; provide a native mapping."
292#ifdef SRN_WITH_SERENE
299 err->
layer = SRN_ERR_PARSE_LAYER;
301 err->
msg = (
char *)msg;
302 err->
as.metadata = metadata;
void * srn_allocate(const srn_context_t *ctx, size_t size, size_t alignment)
Allocate size bytes aligned to alignment from the context's memory block.
#define ALLOC_OR_PANIC(ctx, T)
srn_value_t * srn_value_make(srn_context_t *ctx, srn_value_tag_t tag, srn_metadata_t *metadata, void *payload)
Creates a new serene value.
@ VError
VError should be last.
srn_error_t * srn_errors_make(const srn_context_t *ctx, srn_error_tag_t tag, const char *msg, void *caller)
Build an error in ctx's memory, tagged tag and carrying msg.
static const char * srn_error_tag_name(srn_error_tag_t tag)
void srn_error_trace_push(const srn_context_t *ctx, srn_error_t *err, void *addr)
Append a return address to the trace of a runtime-layer error.
void * srn_errors_fail(const srn_context_t *ctx, size_t size, size_t alignment, srn_error_tag_t tag, const char *msg, void *caller)
Allocate a size/alignment value in ctx, set its ERROR_HEADER (the first member, srn_error_t *maybe_er...
srn_error_t * srn_errors_from(const srn_context_t *ctx, const srn_error_t *src, void *caller)
Build an error in ctx's memory that carries the layer, tag, message and payload of src,...
char * srn_error_to_string(const srn_context_t *ctx, const srn_error_t *err)
Format err as a newly allocated string of the form [TAG]: msg, allocated in ctx.
Error handling for the runtime.
srn_error_tag_t
The kind of a failure.
@ JIT_IR_PARSE_FAILED
The JIT could not parse a module's LLVM IR or bitcode.
@ STRING_LENGTH_LIMIT_EXCEEDED
@ INVALID_ARGUMENT
The request itself is malformed (an empty POLL interest mask, for example), so retrying it unchanged ...
@ CHANNEL_BUSY
The channel already has a full ring's worth of operations in flight.
@ JIT_SYMBOL_ALREADY_DEFINED
A JIT symbol definition collided with a name already defined.
@ JIT_SYMBOL_NOT_FOUND
A JIT symbol lookup found no symbol of that name.
srn_error_tag_t srn_errno_to_tag(int errno_value, srn_error_tag_t default_tag)
Map a POSIX errno to error tag.
#define TRACE_FRAME_DEPTH
Portable symbol resolution for error trace printing.
const char * srn_dbg_sym_name(void *addr, char *buf, size_t buflen)
Resolve addr to a symbol name and write it into buf (null-terminated, at most buflen bytes including ...
A runtime error, a tag classifying the failure and a human-readable message.
union srn_error_t::@110141362101221075206211275212023153042233307220 as
srn_trace_frames_t * frames
This is how we create a traceback for the C level code in the runtime lib.
void * return_addrs[TRACE_FRAME_DEPTH]
#define PANIC_IF_NULL(ptr)
#define PANIC_IF(cond, msg)