Freepascal 保存/还原线程本地存储

Freepascal 保存/还原线程本地存储,freepascal,seh,thread-local-storage,fiber,Freepascal,Seh,Thread Local Storage,Fiber,我试图在FreePascal中使用它来实现协同程序类。到目前为止,我可以分配工作上下文(CreateFiber)并在上下文之间切换(SwitchToFiber) 然而,我无法让异常可靠地工作。在不同的上下文中应该有不同的异常链。使用w32 SEH异常处理程序链时,链切换会在SwitchToFiber中自动发生。但FreePascal不使用w32 SEH链,而是将自己的链存储在threadvar中 我想继续尝试手动保存/恢复ThreadVar。到目前为止,我可以得到ThreadEnvironmen

我试图在FreePascal中使用它来实现协同程序类。到目前为止,我可以分配工作上下文(CreateFiber)并在上下文之间切换(SwitchToFiber)

然而,我无法让异常可靠地工作。在不同的上下文中应该有不同的异常链。使用w32 SEH异常处理程序链时,链切换会在SwitchToFiber中自动发生。但FreePascal不使用w32 SEH链,而是将自己的链存储在threadvar中

我想继续尝试手动保存/恢复ThreadVar。到目前为止,我可以得到ThreadEnvironmentBlock结构:

function GetCurrentTEB: PThreadEnvironmentBlock;
asm
  mov eax, fs:[$18]
end;
我相信ThreadVar存储在ThreadLocalStorage中,它位于ThreadEnvironmentBlock中;-)现在我想正确地保存和恢复ThreadLocalStorage。 需要以下信息:

  • ThreadEnvironmentBlock线程变量存储在何处
  • 如何在全局堆中保存/存储它们