libco icon indicating copy to clipboard operation
libco copied to clipboard

[BUG] 需要在coctx_swap中保存浮点数上下文 [ fnstenv/stmxcsr ]

Open remuscl opened this issue 6 years ago • 4 comments

目前在coctx_swap的实现中,没有保存和恢复浮点数上下文,这样应该会有BUG隐患,因为在x86 cdeclsys v amd64 abi调用约定中并没有关于浮点数上下文的详细约定。

参考: 在glibc的swapcontext.S中进行了浮点数上下文的保存和恢复。

remuscl avatar May 21 '18 01:05 remuscl

请问线程中协程切换时浮点数上下文不保存会有什么问题? 我的理解是线程切换才需要保存浮点数上下文,线程中的协程切换应该不需要吧

Ananfa avatar Jul 25 '18 03:07 Ananfa

但是有些临时变量啥的,会放在寄存器中吧,切换出去之后可能会被覆盖掉。 boost::fcontext提供的是浮点数寄存器是否保存是可选的,一些不使用浮点数的代码可以选择不保存浮点寄存器。

hnwyllmm avatar Aug 16 '18 03:08 hnwyllmm

这里是保证效率,也就是跑分的时候证明这个协程库的上下文切换很快。事实上除了浮点数之外,信号也是没有保存。参考另外一个问题下开发者的回复来看,微信内部使用的协程库应该还有其他组件,并没有整理到开源版本中来。

fowuyu avatar Jan 11 '19 02:01 fowuyu

协程切换发生在用户空间,也就是说,是我们主动发起的转移,不存在信号中断/系统调度等原因导致切换,在编译器看来,就是一个普通的函数调用,所以不要保存浮点环境。 但是,由于程序中可以通过浮点控制字控制浮点单元的运行方式,所以,如果你在程序中存在这样的行为,可以像boost::fcontext一样,保存fpu和mmx两个控制字寄存器,仅此而已。

sunjingji avatar Oct 22 '21 06:10 sunjingji