保存/恢复线程本地存储

时间:2013-11-13 13:52:53

标签: freepascal seh thread-local-storage fiber

我正在尝试在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。 需要以下信息:

  1. 存储ThreadEnvironmentBlock threadvars的位置?
  2. 如何在全局堆中保存/存储它们?

0 个答案:

没有答案