boostorg / boostorg/context

add an ability to execute a callback function on behalf of target coroutine stack right before return to target coroutine

未关闭
#278 3 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
主要语言
Assembly
星标
370
派生
186
平均合并
24 天 6 小时
30 天内合并 PR
1

描述

# rational

when do "jump_fcontext", we have an opportunity to pass "void*" to target coroutine. how to do with that argument is up to the target coroutine.

some time we do want to do some 'clean up job' right before return to the target coroutine. because there exist some task that must not be executed on current stack. for example , free current stack memory.

and for muti-threaded environment, we do need a way to distinguish where a context-switch is finished.

by changing jump_fcontext to `transfer_t jump_fcontext( fcontext_t const to, void * vp, transfer_t (* fn)( fcontext_t from, void*));`
we can now:

- pass a cleanup function to clean stack right after stack pointer got swapped.
- notify the scheduler that "from coroutine context" is now safe to be used as "to coroutine".
- record "from" that does not relay on jumpee coroutine to do the job. that makes code cleaner and easy to understand.
- doing things before return to target is a bit faster. because the registers are not restored and then saved-again by "the code that called when jump_context returns" with is in fact doing things for previous coroutine.

# changes to the assembly code

right after loading RSP from "to".
add this lines
```
test %rdx, %rdx // test for 3th argument, aka callback_fn
je skip_call
mov %rax, %rsi // pass from:fctx argument to callback_fn as first argument, %rdi is already the same argument
call * %rdx // call callback_fn, and use its result as return , do not touch %rax:%rdx pair.
skip_call:
// original code that retore registers
```

贡献指南

这个仓库没有索引到贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。