我正在尝试在FreePascal中使用w32 fiber API来实现协程类。到目前为止,我可以分配工作者上下文(CreateFiber)并在上下文之间切换(SwitchToFiber)。
然而,我无法让异常工作可靠。在不同的上下文中应该有不同的异常链。使用w32 SEH异常处理程序链时,在SwitchToFiber中自动进行链切换。但FreePascal不使用w32 SEH链而是将其自己的链存储在threadvar中。
我想继续尝试手动保存/恢复threadvars。到目前为止,我可以获得ThreadEnvironmentBlock结构:
function GetCurrentTEB: PThreadEnvironmentBlock;
asm
mov eax, fs:[$18]
end;
我相信threadvars存储在ThreadLocalStorage中,它位于ThreadEnvironmentBlock内部;-)现在我想正确保存和恢复ThreadLocalStorage。 需要以下信息: