X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/baca54322c66983205edecd2ebb00d997878be50..270869139db617e29a35bb9ded41087bb702f9ac:/lunaix-os/kernel/process/switch.c?ds=sidebyside diff --git a/lunaix-os/kernel/process/switch.c b/lunaix-os/kernel/process/switch.c new file mode 100644 index 0000000..c5d9f27 --- /dev/null +++ b/lunaix-os/kernel/process/switch.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include + +extern void +signal_dispatch(struct signpost_result* result); + +extern void +preempt_handle_stalled(struct signpost_result* result); + +#define do_signpost(fn, result) \ + do { \ + fn((result)); \ + if ((result)->mode == SWITCH_MODE_FAST) { \ + thread_stats_update_leaving(); \ + return (result)->stack; \ + } \ + if ((result)->mode == SWITCH_MODE_GIVEUP) { \ + schedule(); \ + fail("unexpected return"); \ + } \ + } while (0) + +ptr_t +switch_signposting() +{ + struct signpost_result result; + + do_signpost(preempt_handle_stalled, &result); + + do_signpost(signal_dispatch, &result); + + thread_stats_update_leaving(); + + return 0; +} \ No newline at end of file