threadvr.inc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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. type
  16. pltvInitEntry = ^ltvInitEntry;
  17. ltvInitEntry = packed record
  18. varaddr : pdword;
  19. size : longint;
  20. end;
  21. TltvInitTablesTable = packed record
  22. count : dword;
  23. tables : packed array [1..32767] of pltvInitEntry;
  24. end;
  25. PltvInitTablesTable = ^TltvInitTablesTable;
  26. {$ifndef FPC_HAS_INDIRECT_MAIN_INFORMATION}
  27. var
  28. ThreadvarTablesTable : TltvInitTablesTable; external name 'FPC_THREADVARTABLES';
  29. {$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
  30. procedure init_unit_threadvars (tableEntry : pltvInitEntry);
  31. begin
  32. while tableEntry^.varaddr <> nil do
  33. begin
  34. CurrentTM.InitThreadvar (tableEntry^.varaddr^, tableEntry^.size);
  35. inc (pchar (tableEntry), sizeof (tableEntry^));
  36. end;
  37. end;
  38. procedure init_all_unit_threadvars;
  39. var
  40. i : integer;
  41. begin
  42. {$ifdef DEBUG_MT}
  43. WriteLn ('init_all_unit_threadvars (',
  44. {$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PltvInitTablesTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
  45. ThreadvarTablesTable{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}.count,') units');
  46. {$endif}
  47. for i := 1 to {$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PltvInitTablesTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
  48. ThreadvarTablesTable{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}.count do
  49. init_unit_threadvars ({$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PltvInitTablesTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
  50. ThreadvarTablesTable{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}.tables[i]);
  51. end;
  52. procedure copy_unit_threadvars (tableEntry : pltvInitEntry);
  53. var
  54. oldp,
  55. newp : pointer;
  56. begin
  57. while tableEntry^.varaddr <> nil do
  58. begin
  59. newp:=CurrentTM.RelocateThreadVar(tableEntry^.varaddr^);
  60. oldp:=pointer(pchar(tableEntry^.varaddr)+sizeof(pointer));
  61. move(oldp^,newp^,tableEntry^.size);
  62. inc (pchar (tableEntry), sizeof (tableEntry^));
  63. end;
  64. end;
  65. procedure copy_all_unit_threadvars;
  66. var
  67. i : integer;
  68. begin
  69. {$ifdef DEBUG_MT}
  70. WriteLn ('copy_all_unit_threadvars (',{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PltvInitTablesTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
  71. ThreadvarTablesTable{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}.count,') units');
  72. {$endif}
  73. for i := 1 to {$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PltvInitTablesTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
  74. ThreadvarTablesTable{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}.count do
  75. copy_unit_threadvars ({$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION}PltvInitTablesTable(EntryInformation.{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}
  76. ThreadvarTablesTable{$ifdef FPC_HAS_INDIRECT_MAIN_INFORMATION})^{$endif FPC_HAS_INDIRECT_MAIN_INFORMATION}.tables[i]);
  77. end;
  78. procedure InitThreadVars(RelocProc : Pointer);
  79. begin
  80. { initialize threadvars }
  81. init_all_unit_threadvars;
  82. { allocate mem for main thread threadvars }
  83. CurrentTM.AllocateThreadVars;
  84. { copy main thread threadvars }
  85. copy_all_unit_threadvars;
  86. { install threadvar handler }
  87. fpc_threadvar_relocate_proc:=RelocProc;
  88. {$ifdef FPC_HAS_FEATURE_HEAP}
  89. {$ifndef HAS_MEMORYMANAGER}
  90. RelocateHeap;
  91. {$endif HAS_MEMORYMANAGER}
  92. {$endif}
  93. end;