|
@@ -2,31 +2,17 @@
|
|
$Id$
|
|
$Id$
|
|
****************************************************************************
|
|
****************************************************************************
|
|
|
|
|
|
- Free Pascal -- OS/2 runtime library
|
|
|
|
|
|
+ This file is part of the Free Pascal run time library.
|
|
|
|
+ Copyright (c) 1999-2002 by Free Pascal development team
|
|
|
|
|
|
- Copyright (c) 1999-2000 by Florian Klaempfl
|
|
|
|
- Copyright (c) 1999-2000 by Daniel Mantione
|
|
|
|
|
|
+ Free Pascal - OS/2 (EMX) runtime library
|
|
|
|
|
|
- Free Pascal is distributed under the GNU Public License v2. So is this unit.
|
|
|
|
- The GNU Public License requires you to distribute the source code of this
|
|
|
|
- unit with any product that uses it. We grant you an exception to this, and
|
|
|
|
- that is, when you compile a program with the Free Pascal Compiler, you do not
|
|
|
|
- need to ship source code with that program, AS LONG AS YOU ARE USING
|
|
|
|
- UNMODIFIED CODE! If you modify this code, you MUST change the next line:
|
|
|
|
|
|
+ See the file COPYING.FPC, included in this distribution,
|
|
|
|
+ for details about the copyright.
|
|
|
|
|
|
- <This an official, unmodified Free Pascal source code file.>
|
|
|
|
-
|
|
|
|
- Send us your modified files, we can work together if you want!
|
|
|
|
-
|
|
|
|
- Free Pascal is distributed in the hope that it will be useful,
|
|
|
|
- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
- Library GNU General Public License for more details.
|
|
|
|
-
|
|
|
|
- You should have received a copy of the Library GNU General Public License
|
|
|
|
- along with Free Pascal; see the file COPYING.LIB. If not, write to
|
|
|
|
- the Free Software Foundation, 59 Temple Place - Suite 330,
|
|
|
|
- Boston, MA 02111-1307, USA.
|
|
|
|
|
|
+ This program is distributed in the hope that it will be useful,
|
|
|
|
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
|
****************************************************************************}
|
|
****************************************************************************}
|
|
|
|
|
|
@@ -153,6 +139,9 @@ var
|
|
heap_base: pointer; external name '__heap_base';
|
|
heap_base: pointer; external name '__heap_base';
|
|
heap_brk: pointer; external name '__heap_brk';
|
|
heap_brk: pointer; external name '__heap_brk';
|
|
heap_end: pointer; external name '__heap_end';
|
|
heap_end: pointer; external name '__heap_end';
|
|
|
|
+{$IFDEF CONTHEAP}
|
|
|
|
+ BrkLimit: cardinal;
|
|
|
|
+{$ENDIF CONTHEAP}
|
|
|
|
|
|
procedure DosGetInfoBlocks (PATIB: PPThreadInfoBlock;
|
|
procedure DosGetInfoBlocks (PATIB: PPThreadInfoBlock;
|
|
PAPIB: PPProcessInfoBlock); cdecl;
|
|
PAPIB: PPProcessInfoBlock); cdecl;
|
|
@@ -301,12 +290,32 @@ end;
|
|
{ this function allows to extend the heap by calling
|
|
{ this function allows to extend the heap by calling
|
|
syscall $7f00 resizes the brk area}
|
|
syscall $7f00 resizes the brk area}
|
|
|
|
|
|
-function sbrk(size:longint):longint; assembler;
|
|
|
|
|
|
+function sbrk(size:longint):longint;
|
|
|
|
+{$IFDEF DUMPGROW}
|
|
|
|
+var
|
|
|
|
+ L: longint;
|
|
|
|
+begin
|
|
|
|
+ WriteLn ('Trying to grow heap by ', Size, ' to ', HeapSize + Size);
|
|
|
|
+{$IFDEF CONTHEAP}
|
|
|
|
+ WriteLn ('BrkLimit is ', BrkLimit);
|
|
|
|
+{$ENDIF CONTHEAP}
|
|
|
|
+ asm
|
|
|
|
+ movl size,%edx
|
|
|
|
+ movw $0x7f00,%ax
|
|
|
|
+ call syscall { result directly in EAX }
|
|
|
|
+ mov %eax,L
|
|
|
|
+ end;
|
|
|
|
+ WriteLn ('New heap at ', L);
|
|
|
|
+ Sbrk := L;
|
|
|
|
+end;
|
|
|
|
+{$ELSE DUMPGROW}
|
|
|
|
+ assembler;
|
|
asm
|
|
asm
|
|
movl size,%edx
|
|
movl size,%edx
|
|
movw $0x7f00,%ax
|
|
movw $0x7f00,%ax
|
|
call syscall { result directly in EAX }
|
|
call syscall { result directly in EAX }
|
|
end;
|
|
end;
|
|
|
|
+{$ENDIF DUMPGROW}
|
|
|
|
|
|
function getheapstart:pointer;assembler;
|
|
function getheapstart:pointer;assembler;
|
|
|
|
|
|
@@ -922,7 +931,7 @@ begin
|
|
{$ASMMODE INTEL}
|
|
{$ASMMODE INTEL}
|
|
asm
|
|
asm
|
|
mov os_mode, 0
|
|
mov os_mode, 0
|
|
- mov ax, 7F0Ah
|
|
|
|
|
|
+ mov eax, 7F0Ah
|
|
call syscall
|
|
call syscall
|
|
test bx, 512 {Bit 9 is OS/2 flag.}
|
|
test bx, 512 {Bit 9 is OS/2 flag.}
|
|
setne byte ptr os_mode
|
|
setne byte ptr os_mode
|
|
@@ -933,7 +942,7 @@ begin
|
|
|
|
|
|
{Enable the brk area by initializing it with the initial heap size.}
|
|
{Enable the brk area by initializing it with the initial heap size.}
|
|
|
|
|
|
- mov ax, 7F01h
|
|
|
|
|
|
+ mov eax, 7F01h
|
|
mov edx, heap_brk
|
|
mov edx, heap_brk
|
|
add edx, heap_base
|
|
add edx, heap_base
|
|
call syscall
|
|
call syscall
|
|
@@ -942,7 +951,24 @@ begin
|
|
push dword 204
|
|
push dword 204
|
|
call HandleError
|
|
call HandleError
|
|
@heapok:
|
|
@heapok:
|
|
|
|
+{$IFDEF CONTHEAP}
|
|
|
|
+{ Find out brk limit }
|
|
|
|
+ mov eax, 7F02h
|
|
|
|
+ mov ecx, 3
|
|
|
|
+ call syscall
|
|
|
|
+ jcxz @heaplimitknown
|
|
|
|
+ mov eax, 0
|
|
|
|
+ @heaplimitknown:
|
|
|
|
+ mov BrkLimit, eax
|
|
|
|
+{$ELSE CONTHEAP}
|
|
|
|
+{ Change sbrk behaviour to allocate arbitrary (non-contiguous) memory blocks }
|
|
|
|
+ mov eax, 7F0Fh
|
|
|
|
+ mov ecx, 0Ch
|
|
|
|
+ mov edx, 8
|
|
|
|
+ call syscall
|
|
|
|
+{$ENDIF CONTHEAP}
|
|
end;
|
|
end;
|
|
|
|
+
|
|
{ in OS/2 this will always be nil, but in DOS mode }
|
|
{ in OS/2 this will always be nil, but in DOS mode }
|
|
{ this can be changed. }
|
|
{ this can be changed. }
|
|
first_meg := nil;
|
|
first_meg := nil;
|
|
@@ -950,7 +976,7 @@ begin
|
|
read-access to the first meg. of memory.}
|
|
read-access to the first meg. of memory.}
|
|
if os_mode in [osDOS,osDPMI] then
|
|
if os_mode in [osDOS,osDPMI] then
|
|
asm
|
|
asm
|
|
- mov ax, 7F13h
|
|
|
|
|
|
+ mov eax, 7F13h
|
|
xor ebx, ebx
|
|
xor ebx, ebx
|
|
mov ecx, 0FFFh
|
|
mov ecx, 0FFFh
|
|
xor edx, edx
|
|
xor edx, edx
|
|
@@ -1006,10 +1032,20 @@ begin
|
|
{$ifdef HASVARIANT}
|
|
{$ifdef HASVARIANT}
|
|
initvariantmanager;
|
|
initvariantmanager;
|
|
{$endif HASVARIANT}
|
|
{$endif HASVARIANT}
|
|
|
|
+
|
|
|
|
+{$IFDEF DUMPGROW}
|
|
|
|
+ {$IFDEF CONTHEAP}
|
|
|
|
+ WriteLn ('Initial brk size is ', GetHeapSize);
|
|
|
|
+ WriteLn ('Brk limit is ', BrkLimit);
|
|
|
|
+ {$ENDIF CONTHEAP}
|
|
|
|
+{$ENDIF DUMPGROW}
|
|
end.
|
|
end.
|
|
{
|
|
{
|
|
$Log$
|
|
$Log$
|
|
- Revision 1.25 2002-10-14 19:39:17 peter
|
|
|
|
|
|
+ Revision 1.26 2002-10-27 14:29:00 hajny
|
|
|
|
+ * heap management (hopefully) fixed
|
|
|
|
+
|
|
|
|
+ Revision 1.25 2002/10/14 19:39:17 peter
|
|
* threads unit added for thread support
|
|
* threads unit added for thread support
|
|
|
|
|
|
Revision 1.24 2002/10/13 09:28:45 florian
|
|
Revision 1.24 2002/10/13 09:28:45 florian
|