22#include "xtc_export.h"
42typedef struct xtc_pid {
48#define XTC_PID_NONE ((xtc_pid_t){0, 0, 0})
53 return a.loop_id == b.loop_id &&
54 a.local_id == b.local_id &&
61 return p.loop_id == 0 && p.local_id == 0 && p.gen == 0;
73typedef struct xtc_atomic_pid {
77#define XTC_ATOMIC_PID_INIT { 0, { 0, 0 } }
85typedef int (*xtc_match_fn)(
const void *data,
size_t size,
void *user_data);
92typedef void (*xtc_proc_fn)(
void *arg);
94typedef struct xtc_proc_opts {
104 int mailbox_watermark_pct;
115 void (*mailbox_watermark_fn)(
xtc_pid_t self,
size_t depth,
116 size_t cap,
void *user);
117 void *mailbox_watermark_user;
125 xtc_exec_class_t sched_class;
131#define XTC_PROC_OPTS_INIT { .size = sizeof(xtc_proc_opts_t) }
134typedef struct xtc_mailbox_stats {
145#define XTC_MAILBOX_STATS_INIT { .size = sizeof(xtc_mailbox_stats_t) }
174XTC_API
int xtc_proc_spawn(xtc_loop_t *loop, xtc_proc_fn fn,
void *arg,
195XTC_API
int xtc_proc_spawn_link(xtc_loop_t *loop, xtc_proc_fn fn,
void *arg,
197XTC_API
int xtc_proc_spawn_monitor(xtc_loop_t *loop, xtc_proc_fn fn,
208XTC_API
int xtc_exit_pid(
xtc_pid_t target,
int reason);
222enum xtc_kill_status {
230 XTC_KILL_DELIVERED = 0,
238 XTC_KILL_DEFERRED = 1,
315XTC_API
int xtc_exit_pid_deadline(
xtc_pid_t target,
int reason,
316 int64_t timeout_ns,
int *out_status);
330XTC_API
int xtc_proc_wake(
xtc_pid_t target);
363XTC_API
int xtc_proc_set_userdata(
void *ud);
364XTC_API
void *xtc_proc_userdata(
void);
375XTC_API
int xtc_proc_set_class(xtc_exec_class_t cls);
424XTC_API
int xtc_send(
xtc_pid_t to,
const void *data,
size_t size);
445XTC_API
int xtc_send_owned(
xtc_pid_t to,
void *buf,
size_t size);
462XTC_API
int xtc_recv(
void **out,
size_t *out_size, int64_t timeout_ns);
469XTC_API
int xtc_recv_match(xtc_match_fn match_fn,
void *user_data,
470 void **out,
size_t *out_size,
491typedef struct xtc_msg {
496XTC_API
int xtc_recv_correlate(
const void *corr_value,
size_t corr_size,
553#define XTC_WAIT_MAILBOX 0x10000u
554#define XTC_WAIT_TIMEOUT 0x20000u
556XTC_API
int xtc_proc_wait_fd(
int fd, uint32_t interest, int64_t timeout_ns,
557 uint32_t *out_revents);
563XTC_API
int xtc_proc_sleep(int64_t ns);
567XTC_API
int xtc_exit_self(
int reason);
589XTC_API
int xtc_proc_trap_exit(
int on);
590#define XTC_HAVE_PROC_TRAP_EXIT 1
617#define XTC_DOWN_NOPROC (-100000)
620xtc_down_is_noproc(
int reason)
622 return reason == XTC_DOWN_NOPROC;
631XTC_API
int xtc_monitor(
xtc_pid_t target, uint64_t *out_ref);
655#if (defined(__sun) || defined(__illumos__)) && !defined(__EXTENSIONS__)
661#define __EXTENSIONS__ 1
686int xtc_fault_guard_install(
void);
697void __xtc_recovery_prep(
void);
698CONTEXT *__xtc_recovery_ctx(
void);
699int __xtc_recovery_result(
void);
732#define xtc_proc_recovery_arm() \
733 (__xtc_recovery_prep(), \
734 RtlCaptureContext(__xtc_recovery_ctx()), \
735 __xtc_recovery_result())
737#define xtc_proc_recovery_arm() (sigsetjmp(*__xtc_proc_recovery_slot(), 1))
741void xtc_proc_recovery_disarm(
void);
746void xtc_proc_critical_enter(
void);
747void xtc_proc_critical_leave(
void);
758int xtc_proc_at_exit(
void (*fn)(
void *),
void *arg);
764struct xtc_mctx *xtc_proc_mctx(
void);
804int xtc_proc_recovery_track_fd(
int fd);
805int xtc_proc_recovery_track_mctx(
struct xtc_mctx *mctx);
806int xtc_proc_recovery_track_locks(
void *mgr, uint64_t locker,
807 void (*release_all)(
void *, uint64_t));
808int xtc_proc_recovery_track(
void (*fn)(
void *),
void *arg);
809int xtc_proc_recovery_untrack_fd(
int fd);
810void xtc_proc_recovery_cleanup(
void);
821#define xtc_proc_recovery_arm_clean() \
823 int __xtc_rsig = xtc_proc_recovery_arm(); \
824 if (__xtc_rsig != 0) { \
825 xtc_proc_recovery_cleanup(); \
826 (void)xtc_exit_self(__xtc_rsig); \
847XTC_API
int xtc_uncancelable(
int (*body)(
void *),
void *ud);
859XTC_API
int xtc_cancel_poll(
int (*body)(
void *),
void *ud);
870XTC_API
int xtc_cancel_requested(
void);
912XTC_API
int xtc_mask_enter(
void);
913XTC_API
int xtc_mask_leave(
void);
932typedef struct xtc_scope xtc_scope_t;
933typedef void (*xtc_finalizer_fn)(
void *arg);
940XTC_API xtc_scope_t *xtc_scope_open(
void);
941XTC_API
int xtc_scope_defer(xtc_scope_t *s, xtc_finalizer_fn fn,
void *arg);
942XTC_API
void xtc_scope_close(xtc_scope_t *s);
955XTC_API
int xtc_bracket(
int (*acquire)(
void **res,
void *ud),
956 int (*use)(
void *res,
void *ud),
957 void (*release)(
void *res,
void *ud),
965int xtc_down_decode(
const void *msg,
size_t len,
979 XTC_DOWN_KIND_CLEAN = 0,
980 XTC_DOWN_KIND_EXIT = 1,
981 XTC_DOWN_KIND_SIGNAL = 2,
982 XTC_DOWN_KIND_NOPROC = 3,
983 XTC_DOWN_KIND_NOCONNECTION = 4
989typedef struct xtc_down_info {
992 xtc_down_kind_t kind;
999#define XTC_DOWN_INFO_INIT { .size = sizeof(xtc_down_info_t) }
1010XTC_API
int xtc_down_decode_ex(
const void *msg,
size_t len,
1018static inline int xtc_down_is_signal_reason(
int reason)
1020 return reason >= 1 && reason <= 255;
1022static inline int xtc_down_is_exit_reason(
int reason)
1024 return reason == 0 || reason >= 256;