±ÍÇÏ´Â ¼Õ´Ô À̽ʴϴÙ
·Î±×ÀÎ
ȸ¿ø°¡ÀÔ
  
  µ¨¸¶´ç °ø½Ä ÀºÇà°èÁÂ
  ÇϳªÀºÇà 227-910235-83607
  ¿¹±ÝÁÖ ÀÌ»ó±¹(¿î¿µÁø)
ÇÁ·ÎÁ§Æ® °Ô½ÃÆÇ
ÅõÇ¥°Ô½ÃÆÇ
µ¨¸¶´ç¼Ò°³
±âÃʺÎÅÍ È°¿ë±îÁö! µ¨ÆÄÀÌ ±³À° - µ¥ºê±â¾î
lazarus lazarus ÀÔ´Ï´Ù.
±Û³»¿ë - lazarus
 fpc¿Í win32 SEH(¾÷µ¥ÀÌÆ®2)
Æĸ£¼¿
(±èµµ¿Ï)
2013-11-15 ¿ÀÀü 9:27:14
1322ȸ Á¶È¸


÷ºÎÆÄÀÏ ´Ù¿î·Îµå
fpc_win32_per_thread_seh.zip
¾÷µ¥ÀÌÆ®2)

´ëÃæ ¹®Á¦ÀÇ ÇÙ½ÉÀÎ Win32 SEHÀÇ FPC ±¸Çö °¡´É¼ºÀ» ãÀº °Í °°½À´Ï´Ù. ÀÏ´Ü ¸®Æ÷Æø¸ Çسö¼­ ¾÷µ¥ÀÌÆ® µÉ·ÃÁö´Â ¸ð¸£°Ú³×¿ä. ÀÌ ¹®Á¦´Â DLLÀÇ ÀͼÁ¼ÇÀ» ÀÏÀ¸Å°´Â °ÍÀ» ¹æÁöÇÕ´Ï´Ù. ÇöÀç FPCÀÇ DLLÀº ÀͼÁ¼Ç Çڵ鸵ÀÌ Àß µÇÁö ¾Ê½À´Ï´Ù. ¸¸¾à Àû¿ëµÈ´Ù°í Çصµ ÄÄÆÄÀÏ·¯ ÂÊÀÇ ÄÚµå »ý¼º±âÂÊÀÌ º¯È­ÇØ¾ß Çϴ°Ŷó ÇÙ½É °³¹ßÀÚµéÀÌ °íÄ¡Áö ¾ÊÀ¸¸é ¾î·Á¿ï°Å¶ó »ý°¢µË´Ï´Ù.



´ëÃæ ¸¸µç ±âº»Æ²ÀÌ µé¾î°£ ¼Ò½º¸¦ ¾÷·ÎµåÇÕ´Ï´Ù.



===============================================================



ÃÖ±Ù ¹ö±×¸®Æ÷Æ®¿¡ Fiber±¸Çö¿¡ °ü·ÃµÈ ¹ö±×¸®Æ÷Æ®°¡ Çϳª.



http://bugs.freepascal.org/view.php?id=25312



FiberÀÇ ¿¹¿Ü󸮸¦ Àâ¾Æ³»Áö ¸øÇÏ´Â °ü°è·Î ¹ö±×°¡ ¿Ã¶ó¿Ô½À´Ï´Ù. 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;