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 {
115int xtc_proc_spawn(xtc_loop_t *loop, xtc_proc_fn fn,
void *arg,
135int xtc_proc_spawn_link(xtc_loop_t *loop, xtc_proc_fn fn,
void *arg,
137int xtc_proc_spawn_monitor(xtc_loop_t *loop, xtc_proc_fn fn,
148int xtc_exit_pid(
xtc_pid_t target,
int reason);
176int xtc_send(
xtc_pid_t to,
const void *data,
size_t size);
190int xtc_recv(
void **out,
size_t *out_size, int64_t timeout_ns);
197int xtc_recv_match(xtc_match_fn match_fn,
void *user_data,
198 void **out,
size_t *out_size,
219typedef struct xtc_msg {
224int xtc_recv_correlate(
const void *corr_value,
size_t corr_size,
251#define XTC_WAIT_MAILBOX 0x10000u
252#define XTC_WAIT_TIMEOUT 0x20000u
254int xtc_proc_wait_fd(
int fd, uint32_t interest, int64_t timeout_ns,
255 uint32_t *out_revents);
261int xtc_proc_sleep(int64_t ns);
265int xtc_exit_self(
int reason);
296#define XTC_DOWN_NOPROC (-100000)
299xtc_down_is_noproc(
int reason)
301 return reason == XTC_DOWN_NOPROC;
310int xtc_monitor(
xtc_pid_t target, uint64_t *out_ref);
334#if (defined(__sun) || defined(__illumos__)) && !defined(__EXTENSIONS__)
340#define __EXTENSIONS__ 1
365int xtc_fault_guard_install(
void);
376void __xtc_recovery_prep(
void);
377CONTEXT *__xtc_recovery_ctx(
void);
378int __xtc_recovery_result(
void);
411#define xtc_proc_recovery_arm() \
412 (__xtc_recovery_prep(), \
413 RtlCaptureContext(__xtc_recovery_ctx()), \
414 __xtc_recovery_result())
416#define xtc_proc_recovery_arm() (sigsetjmp(*__xtc_proc_recovery_slot(), 1))
420void xtc_proc_recovery_disarm(
void);
425void xtc_proc_critical_enter(
void);
426void xtc_proc_critical_leave(
void);
437int xtc_proc_at_exit(
void (*fn)(
void *),
void *arg);
443struct xtc_mctx *xtc_proc_mctx(
void);
483int xtc_proc_recovery_track_fd(
int fd);
484int xtc_proc_recovery_track_mctx(
struct xtc_mctx *mctx);
485int xtc_proc_recovery_track_locks(
void *mgr, uint64_t locker,
486 void (*release_all)(
void *, uint64_t));
487int xtc_proc_recovery_track(
void (*fn)(
void *),
void *arg);
488int xtc_proc_recovery_untrack_fd(
int fd);
489void xtc_proc_recovery_cleanup(
void);
500#define xtc_proc_recovery_arm_clean() \
502 int __xtc_rsig = xtc_proc_recovery_arm(); \
503 if (__xtc_rsig != 0) { \
504 xtc_proc_recovery_cleanup(); \
505 (void)xtc_exit_self(__xtc_rsig); \
514int xtc_down_decode(
const void *msg,
size_t len,
528 XTC_DOWN_KIND_CLEAN = 0,
529 XTC_DOWN_KIND_EXIT = 1,
530 XTC_DOWN_KIND_SIGNAL = 2,
531 XTC_DOWN_KIND_NOPROC = 3
536 xtc_down_kind_t kind;
552int xtc_down_decode_ex(
const void *msg,
size_t len,
560static inline int xtc_down_is_signal_reason(
int reason)
562 return reason >= 1 && reason <= 255;
564static inline int xtc_down_is_exit_reason(
int reason)
566 return reason == 0 || reason >= 256;
573void *__xtc_proc_ctx_save(
void);
574void __xtc_proc_ctx_restore(
void *ctx);