2

我正在尝试在 FreePascal 中使用w32 光纤 API来实现协程类。到目前为止,我可以分配工作上下文 (CreateFiber) 并在上下文之间切换 (SwitchToFiber)。

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

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

function GetCurrentTEB: PThreadEnvironmentBlock;
asm
  mov eax, fs:[$18]
end;

我相信线程变量存储在 ThreadLocalStorage 中,它位于 ThreadEnvironmentBlock 内的某个位置;-) 现在我想正确保存和恢复 ThreadLocalStorage。需要以下信息:

  1. ThreadEnvironmentBlock 线程变量存储在哪里?
  2. 如何将它们保存/存储到全局堆中/从全局堆中保存?
4

0 回答 0