33typedef struct xtc_pid {
39#define XTC_PID_NONE ((xtc_pid_t){0, 0, 0})
44 return a.loop_id == b.loop_id &&
45 a.local_id == b.local_id &&
52 return p.loop_id == 0 && p.local_id == 0 && p.gen == 0;
61typedef int (*xtc_match_fn)(
const void *data,
size_t size,
void *user_data);
68typedef void (*xtc_proc_fn)(
void *arg);
70typedef struct xtc_proc_opts {
80 int mailbox_watermark_pct;
81 void (*mailbox_watermark_fn)(
xtc_pid_t self,
size_t depth,
82 size_t cap,
void *user);
83 void *mailbox_watermark_user;
87typedef struct xtc_mailbox_stats {
116int xtc_proc_spawn(xtc_loop_t *loop, xtc_proc_fn fn,
void *arg,
136int xtc_proc_spawn_link(xtc_loop_t *loop, xtc_proc_fn fn,
void *arg,
138int xtc_proc_spawn_monitor(xtc_loop_t *loop, xtc_proc_fn fn,
149int xtc_exit_pid(
xtc_pid_t target,
int reason);
191int xtc_send(
xtc_pid_t to,
const void *data,
size_t size);
205int xtc_recv(
void **out,
size_t *out_size, int64_t timeout_ns);
212int xtc_recv_match(xtc_match_fn match_fn,
void *user_data,
213 void **out,
size_t *out_size,
234typedef struct xtc_msg {
239int xtc_recv_correlate(
const void *corr_value,
size_t corr_size,
266#define XTC_WAIT_MAILBOX 0x10000u
267#define XTC_WAIT_TIMEOUT 0x20000u
269int xtc_proc_wait_fd(
int fd, uint32_t interest, int64_t timeout_ns,
270 uint32_t *out_revents);
276int xtc_proc_sleep(int64_t ns);
280int xtc_exit_self(
int reason);
311#define XTC_DOWN_NOPROC (-100000)
314xtc_down_is_noproc(
int reason)
316 return reason == XTC_DOWN_NOPROC;
325int xtc_monitor(
xtc_pid_t target, uint64_t *out_ref);
349#if (defined(__sun) || defined(__illumos__)) && !defined(__EXTENSIONS__)
355#define __EXTENSIONS__ 1
380int xtc_fault_guard_install(
void);
391void __xtc_recovery_prep(
void);
392CONTEXT *__xtc_recovery_ctx(
void);
393int __xtc_recovery_result(
void);
426#define xtc_proc_recovery_arm() \
427 (__xtc_recovery_prep(), \
428 RtlCaptureContext(__xtc_recovery_ctx()), \
429 __xtc_recovery_result())
431#define xtc_proc_recovery_arm() (sigsetjmp(*__xtc_proc_recovery_slot(), 1))
435void xtc_proc_recovery_disarm(
void);
440void xtc_proc_critical_enter(
void);
441void xtc_proc_critical_leave(
void);
452int xtc_proc_at_exit(
void (*fn)(
void *),
void *arg);
458struct xtc_mctx *xtc_proc_mctx(
void);
498int xtc_proc_recovery_track_fd(
int fd);
499int xtc_proc_recovery_track_mctx(
struct xtc_mctx *mctx);
500int xtc_proc_recovery_track_locks(
void *mgr, uint64_t locker,
501 void (*release_all)(
void *, uint64_t));
502int xtc_proc_recovery_track(
void (*fn)(
void *),
void *arg);
503int xtc_proc_recovery_untrack_fd(
int fd);
504void xtc_proc_recovery_cleanup(
void);
515#define xtc_proc_recovery_arm_clean() \
517 int __xtc_rsig = xtc_proc_recovery_arm(); \
518 if (__xtc_rsig != 0) { \
519 xtc_proc_recovery_cleanup(); \
520 (void)xtc_exit_self(__xtc_rsig); \
529int xtc_down_decode(
const void *msg,
size_t len,
543 XTC_DOWN_KIND_CLEAN = 0,
544 XTC_DOWN_KIND_EXIT = 1,
545 XTC_DOWN_KIND_SIGNAL = 2,
546 XTC_DOWN_KIND_NOPROC = 3,
547 XTC_DOWN_KIND_NOCONNECTION = 4
555 xtc_down_kind_t kind;
571int xtc_down_decode_ex(
const void *msg,
size_t len,
579static inline int xtc_down_is_signal_reason(
int reason)
581 return reason >= 1 && reason <= 255;
583static inline int xtc_down_is_exit_reason(
int reason)
585 return reason == 0 || reason >= 256;
592void *__xtc_proc_ctx_save(
void);
593void __xtc_proc_ctx_restore(
void *ctx);