threadvr.inc 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2000 by Michael Van Canneyt
  4. member of the Free Pascal development team
  5. Threadvar support, platform independent part
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {*****************************************************************************
  13. Threadvar support
  14. *****************************************************************************}
  15. {$ifdef HASTHREADVAR}
  16. type
  17. pltvInitEntry = ^ltvInitEntry;
  18. ltvInitEntry = packed record
  19. varaddr : pdword;
  20. size : longint;
  21. end;
  22. TltvInitTablesTable = packed record
  23. count : dword;
  24. tables : packed array [1..32767] of pltvInitEntry;
  25. end;
  26. var
  27. ThreadvarTablesTable : TltvInitTablesTable; external name 'FPC_THREADVARTABLES';
  28. procedure init_unit_threadvars (tableEntry : pltvInitEntry);
  29. begin
  30. while tableEntry^.varaddr <> nil do
  31. begin
  32. CurrentTM.InitThreadvar (tableEntry^.varaddr^, tableEntry^.size);
  33. inc (pchar (tableEntry), sizeof (tableEntry^));
  34. end;
  35. end;
  36. procedure init_all_unit_threadvars;
  37. var
  38. i : integer;
  39. begin
  40. {$ifdef DEBUG_MT}
  41. WriteLn ('init_all_unit_threadvars (',ThreadvarTablesTable.count,') units');
  42. {$endif}
  43. for i := 1 to ThreadvarTablesTable.count do
  44. init_unit_threadvars (ThreadvarTablesTable.tables[i]);
  45. end;
  46. procedure copy_unit_threadvars (tableEntry : pltvInitEntry);
  47. var
  48. oldp,
  49. newp : pointer;
  50. begin
  51. while tableEntry^.varaddr <> nil do
  52. begin
  53. newp:=CurrentTM.RelocateThreadVar(tableEntry^.varaddr^);
  54. oldp:=pointer(pchar(tableEntry^.varaddr)+sizeof(pointer));
  55. move(oldp^,newp^,tableEntry^.size);
  56. inc (pchar (tableEntry), sizeof (tableEntry^));
  57. end;
  58. end;
  59. procedure copy_all_unit_threadvars;
  60. var
  61. i : integer;
  62. begin
  63. {$ifdef DEBUG_MT}
  64. WriteLn ('copy_all_unit_threadvars (',ThreadvarTablesTable.count,') units');
  65. {$endif}
  66. for i := 1 to ThreadvarTablesTable.count do
  67. copy_unit_threadvars (ThreadvarTablesTable.tables[i]);
  68. end;
  69. procedure InitThreadVars(RelocProc : Pointer);
  70. begin
  71. { initialize threadvars }
  72. init_all_unit_threadvars;
  73. { allocate mem for main thread threadvars }
  74. CurrentTM.AllocateThreadVars;
  75. { copy main thread threadvars }
  76. copy_all_unit_threadvars;
  77. { install threadvar handler }
  78. fpc_threadvar_relocate_proc:=RelocProc;
  79. end;
  80. {$endif HASTHREADVAR}
  81. {
  82. $Log: threadvr.inc,v $
  83. Revision 1.5 2005/02/14 17:13:29 peter
  84. * truncate log
  85. Revision 1.4 2005/02/05 23:49:49 florian
  86. * threadvars on x86_64 fixed
  87. }