threadvr.inc 3.1 KB

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