¾÷µ¥ÀÌÆ®2)
´ëÃæ ¹®Á¦ÀÇ ÇÙ½ÉÀÎ Win32 SEHÀÇ FPC ±¸Çö °¡´É¼ºÀ» ãÀº °Í °°½À´Ï´Ù. ÀÏ´Ü ¸®Æ÷Æø¸ Çسö¼ ¾÷µ¥ÀÌÆ® µÉ·ÃÁö´Â ¸ð¸£°Ú³×¿ä. ÀÌ ¹®Á¦´Â DLLÀÇ ÀͼÁ¼ÇÀ» ÀÏÀ¸Å°´Â °ÍÀ» ¹æÁöÇÕ´Ï´Ù. ÇöÀç FPCÀÇ DLLÀº ÀͼÁ¼Ç Çڵ鸵ÀÌ Àß µÇÁö ¾Ê½À´Ï´Ù. ¸¸¾à Àû¿ëµÈ´Ù°í Çصµ ÄÄÆÄÀÏ·¯ ÂÊÀÇ ÄÚµå »ý¼º±âÂÊÀÌ º¯ÈÇØ¾ß Çϴ°Ŷó ÇÙ½É °³¹ßÀÚµéÀÌ °íÄ¡Áö ¾ÊÀ¸¸é ¾î·Á¿ï°Å¶ó »ý°¢µË´Ï´Ù.
´ëÃæ ¸¸µç ±âº»Æ²ÀÌ µé¾î°£ ¼Ò½º¸¦ ¾÷·ÎµåÇÕ´Ï´Ù.
===============================================================
ÃÖ±Ù ¹ö±×¸®Æ÷Æ®¿¡ Fiber±¸Çö¿¡ °ü·ÃµÈ ¹ö±×¸®Æ÷Æ®°¡ Çϳª.
http://bugs.freepascal.org/view.php?id=25312FiberÀÇ ¿¹¿Ü󸮸¦ Àâ¾Æ³»Áö ¸øÇÏ´Â °ü°è·Î ¹ö±×°¡ ¿Ã¶ó¿Ô½À´Ï´Ù. 2.6.2¿Í 2.7.1¿¡¼ ¸ðµÎ ÀϾ´Â Çö»óÀ¸·Î WIN32 SEH°¡ Á¦´ë·Î ¿¹¿Ü¸¦ Àâ¾Æ³»Áö ¸øÇÏ´Â ¹®Á¦ÀÔ´Ï´Ù.
ÃÖ±Ù¿¡ ¸¹ÀÌ Á¤¼ºÀÌ ±â¿ïÀÎ WIN64 SEH´Â ¹®Á¦¾øÀÌ ÀÛµ¿ÇÏ´Â °ÍÀ» È®ÀÎ.
¸»¹Ì¿¡ fpc °³¹ßÀÚÀÇ ±ÛÀÌ ´Þ·È´Âµ¥, ¹®Á¦°¡ ÇØ°áµÈ´Ù´Â º¸ÀåÀ» ÇÒ ¼ö ¾øÀ» °Í °°´Ù´Â ³»¿ëÀÌ;
¿ÀǼҽºÀÌ´Ï °¿äµµ ÇÒ ¼ö ¾ø´Â ¹®Á¦ÀÎ °Í °°½À´Ï´Ù. =_=;
Ȥ ¾²·¹µå³ª ±âŸ ÂÊÀÇ ¿¹¿Ü󸮰¡ ¾ÈµÇ¸é ¾Æ¸¶ ÀÌ ¹®Á¦ÀÏ°Ì´Ï´Ù.
Âü°íÇϽñ⸦~
¾÷µ¥ÀÌÆ®) Áö±Ý±îÁö ³»¿ëÀ¸·Î ¾Ë·ÁÁø °ÍÀº Fiber´Â FLS¶ó´Â ÀúÀå °ø°£ÀÌ Àִµ¥, fpc´Â ÇöÀç WIN64µµ WIN32µµ TLS¸¸À» »ç¿ë. Fiber¸¦ ÀúÀå °ø°£¿¡´Â ¿¹¿Ü Çڵ鷯µµ µé¾î°¡ ÀÖ¾î »ç¿ë½Ã ¸¶´Ù ½ºÀ§ÄªµÇ´Âµ¥, ÀÌ´Â Fls* ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß Á¦´ë·Î Á¢±ÙÀÌ °¡´ÉÇÏ´Ù°í ÇÕ´Ï´Ù. ¹®Á¦´Â ÀÌ API´Â À©µµ¿ìÁî 2003ÀÌ»ó ±×¸®°í XP 64ºñÆ® À̻󿡼¸¸ Áö¿øÇÏ´Â API¶ó´Â °Í. XP 32ºñÆ®´Â Áö¿øÇÏÁö ¾Ê½À´Ï´Ù. 64ºñÆ®¿¡¼ Fiber¿¹Á¦°¡ ¿À·ù°¡ ¾ø¾ú´ø °ÍÀº ¿ì¿¬ÀûÀÎ °ÍÀ¸·Î ´õ º¹ÀâÇÑ ±¸ÇöÀ¸·Î µé¾î°¡¸é ¹®Á¦°¡ »ý±æ°Å¶ó°í ÇÕ´Ï´Ù.
°á·ÐÀûÀ¸·Î ÇöÀçÀÇ Thread µµÀÔÀº ¾ÈÁ¤ÀûÀ̳ª Fiber¿¡´Â RTLÀÇ ¾÷µ¥ÀÌÆ®°¡ ÀÖ¾î¾ß Á¦´ë·Î Áö¿øÀÌ °¡´ÉÇÏ´Ù°í ÇÕ´Ï´Ù. TLS* API¸¦ FLS*·Î ¹Ù²Ù´Â ¹æ¹ýÀε¥ Á¤Àû ¸µÅ©·Î µÇ¾î ÀÖ¾î¼ ¼öÁ¤°ú µµÀÔ¿¡ ½Ã°£ÀÌ Á» °É¸± µí ½Í½À´Ï´Ù.
(¾÷µ¥ÀÌÆ®) ¹ö±×¸®Æ÷ÆÃÀ» ÇÑ ¸®Æ÷ÅÍ°¡ W64¿¡¼´Â ¹®Á¦°¡ ¾øÀ½À» À̾߱â. WIN32ÀÇ ¹®Á¦´Â FiberÁö¿øÀÌ ¾Æ´Ñ ÀͼÁ¼Ç ÇÁ·¹ÀÓ Æ÷ÀÎÅÍ°¡ ´Ù¸¥ ¾²·¹µå¿¡¼ ÇØÁ¦µÇ´Â ¹ö±×¿¡ ÀÖ´Â °Í °°Àºµ¥ ¾ÆÁ÷ °³¹ßÀÚµé Ãø¿¡¼± ¸ð¸£´Â °Í °°½À´Ï´Ù.
ÀÓ½ÃÀûÀÎ ÆÐÄ¡´Â except.inc ÆÄÀÏ¿¡ ÇÔ¼ö Çϳª¸¦ ´ÙÀ½°ú °°ÀÌ °íÄ¡¸é µË´Ï´Ù.
WIN32¿¡¸¸ ±¹ÇѵǴ ³»¿ëÀÔ´Ï´Ù.
ÀͼÁ¼Ç ÇÁ·¹ÀÓµéÀÇ ¸µÅ©µå ¸®½ºÆ®¿¡¼ È£ÃâµÈ ½ºÅÃÀÇ ¹üÀ§¿¡¼¸¸ ÇØÁ¦¸¦ Çϵµ·Ï ÇÑ °ÍÀÔ´Ï´Ù.
Âü°íÇϽñæ~
Procedure fpc_PopAddrStack;[Public, Alias : 'FPC_POPADDRSTACK']; compilerproc;
var
hp : ^PExceptAddr;
{$ifdef win32}
prev,curr : PExceptAddr;
cstack, TopStack : PtrUInt;
{$endif}
begin
{$ifdef excdebug}
writeln ('In Popaddrstack');
{$endif}
hp:=@ExceptAddrStack;
If hp^=nil then
begin
{$ifdef excdebug}
writeln ('At end of ExceptionAddresStack');
{$endif}
halt (255);
end
else
begin
{$ifdef win32}
asm
mov %ebp,cstack
mov %fs:(4),%eax
mov %eax,TopStack
end;
// remove skiped poping
if (ExceptAddrSkip<>nil) then
if (PtrUInt(ExceptAddrSkip)<TopStack) and (PtrUInt(ExceptAddrSkip)>cstack) then
begin
ExceptAddrSkip:=nil;
while SkipAddrCount>0 do begin
hp^:=hp^^.Next;
Dec(SkipAddrCount);
if hp^=nil then
break;
end;
end;
// start traverse
prev:=hp^;
curr:=prev;
while curr<>nil do
begin
// exceptstack in stack range
if (PtrUInt(curr)<TopStack) and (PtrUInt(curr)>cstack) then
begin
if curr=prev then
hp^:=hp^^.Next
else
prev^.Next:=curr^.Next;
break;
end else begin
// prevent main thread's other thread poping
if PtrUInt(curr)>TopStack then
begin
if ExceptAddrSkip=nil then
begin
ExceptAddrSkip:=Pointer(cstack);
SkipAddrCount:=1;
end else
Inc(SkipAddrCount);
break;
end;
prev:=curr;
curr:=curr^.Next;
end;
end;
{$else}
hp^:=hp^^.Next;
{$endif}
end;
end;