Commit Graph

52 Commits

Author SHA1 Message Date
yury
9d41a435c2 * tinyheap: Disable inline when FPC_TINYHEAP_HUGE is defined to prevent code bloat.
git-svn-id: trunk@46492 -
2020-08-19 10:48:00 +00:00
yury
6edbc9ed7e * tinyheap: Early check for very big requested mem sizes in order to prevent overflows and properly report the out of memory error.
git-svn-id: trunk@45844 -
2020-07-24 16:02:13 +00:00
pierre
a16326fa95 Avoid MSDOS Memory Control Block (MCB) chain corruption in RegisterTinyHeapBlock
git-svn-id: trunk@36340 -
2017-05-26 06:44:07 +00:00
pierre
0f80603dae + SysGetMem: Add DEBUG_TINY_HEAP message after SysAlloc call.
* Change InternalTinyAlign procedure:
  Change variable ASize to be VAR parameter type
  so that possible size reduction required by alignment
  is propagated correctly to calling function.

git-svn-id: trunk@36297 -
2017-05-22 20:27:08 +00:00
pierre
ade39069e5 Change ASize type for RegisterTinyHeapBlockXXX functions
git-svn-id: trunk@36249 -
2017-05-18 22:36:24 +00:00
pierre
570f159e65 Get SysGetMem to return immediately with Result=Nil if SysOSAlloc fails and RetrunNilIfGrowHeapFails is true
git-svn-id: trunk@36239 -
2017-05-18 08:19:17 +00:00
pierre
a72434e93a Trial to clarify heap for i8086 issues:
- MSDOS heap in tinyheap.inc modified to use usual
  SysGetMem and similar names.
  - Use HAS_MEMORYMANAGER (used previously in wince source code,
  to specify that a memory manager is defined elsewhere than inside
  heap.inc include file.
  - Use
  - Remove TinyHeapMemoryManager Structure variable completely

  heaptrc.pp: remove unneeded macro code after name changes of tinyheap.inc

  msdos/system.pp now only defines HAS_MEMORYMANAGER macro
  win16/system.pp defines HAS_MEMORYMANAGER and FPC_NO_DEFAULT_HEAP
  as it still uses a different memory manager.
  __stkbottom variable added for win16 system.pp as it is required
  by i8086 specific stack check code.

git-svn-id: trunk@33983 -
2016-06-13 22:26:03 +00:00
pierre
91595447c6 Add SysTinyGetHeapStatus and SysTinyGetFPCHeapStatus functions
git-svn-id: trunk@33681 -
2016-05-11 14:37:38 +00:00
nickysn
d8a9860e92 + optimization in tinyheap's reallocmem for the case when there's not enough
space after the block, but it becomes enough when the space before the block
  is also reclaimed

git-svn-id: trunk@28786 -
2014-10-07 14:36:23 +00:00
nickysn
1e0a69fa7f + optimizations in SysTinyReAllocMem for the case when growing the heap block
and there is enough free space after the block

git-svn-id: trunk@28723 -
2014-09-29 09:48:45 +00:00
nickysn
e9dc9735a0 + check whether the pointer passed to SysTinyReAllocMem is within the heap area
(the same check used as in SysTinyFreeMem)

git-svn-id: trunk@28721 -
2014-09-28 15:27:44 +00:00
nickysn
e4f3f33692 + optimization in SysTinyReAllocMem for the case of shrinking a memory block
git-svn-id: trunk@28714 -
2014-09-23 01:29:53 +00:00
nickysn
782b033acd * optimized SysTinyReAllocMem for the case when the new and old size are the
same after alignment to TinyHeapAllocGranularity

git-svn-id: trunk@28706 -
2014-09-22 12:48:12 +00:00
nickysn
4e48190342 + implemented Mark and Release for the tiny heap
git-svn-id: trunk@28700 -
2014-09-20 23:33:54 +00:00
nickysn
6735e717ef * the results of MemAvail and MaxAvail changed to LongInt in the i8086 far data
memory models (TP7 compatibility)

git-svn-id: trunk@28667 -
2014-09-14 21:11:32 +00:00
nickysn
00c98edd29 * the FPC_TINYHEAP_HUGE define moved to tnyheaph.inc
git-svn-id: trunk@28666 -
2014-09-14 20:42:35 +00:00
nickysn
706a1d8712 * the FPC_HEAP_HUGE define renamed FPC_TINYHEAP_HUGE, because it applies to the
tiny heap, not the regular one

git-svn-id: trunk@28665 -
2014-09-14 20:10:48 +00:00
nickysn
624b3204d8 + added and implemented MemAvail and MaxAvail for the tiny heap
git-svn-id: trunk@28664 -
2014-09-14 18:35:15 +00:00
nickysn
ad7111ad4d * SysTinyFreeMem: terminate with a runtime error if Addr is >= HeapPtr, since
InternalTinyFreeMem cannot handle that (which causes heap corruption), and it
  indicates a bug in the program anyway, because the area between HeapPtr and
  HeapEnd is free (so it indicates either a double free or freeing an invalid
  pointer).

git-svn-id: trunk@28658 -
2014-09-14 14:47:13 +00:00
nickysn
bb07318386 + added RegisterTinyHeapBlock_Simple_Prealigned procedure, which is the same as
RegisterTinyHeapBlock_Simple, but expects its address and size parameters to
  be already aligned on a TinyHeapAllocGranularity boundary

git-svn-id: trunk@28651 -
2014-09-13 15:35:46 +00:00
nickysn
c8e9d2cf6e + added a simplified version of RegisterTinyHeapBlock, for use when the tiny
heap is a single memory block

git-svn-id: trunk@28635 -
2014-09-09 12:45:47 +00:00
nickysn
72ba70f7ec * use HexStr instead of casting to PtrUInt for logging pointers, when
DEBUG_TINY_HEAP is defined, because HexStr produces nicer results for far
  pointers

git-svn-id: trunk@28633 -
2014-09-09 00:47:25 +00:00
nickysn
bf8a7f0784 * handle properly the case when RegisterTinyHeapBlock is called with a start
address equal or larger than HeapEnd

git-svn-id: trunk@28621 -
2014-09-08 17:45:09 +00:00
nickysn
af1c5096d6 * tiny heap made TP7 compatible; the FreeList and HeapPtr variables made public
git-svn-id: trunk@28612 -
2014-09-07 19:41:53 +00:00
nickysn
e4095588d6 * the type of FreeList changed to an untyped pointer (TP7 compatibility)
git-svn-id: trunk@28608 -
2014-09-06 18:52:43 +00:00
nickysn
a4d71348dd * TinyHeapBlocks renamed FreeList for TP7 compatibility reasons (and it'll be
moved to the interface part of the system unit as soon as the tiny heap's free
  list becomes TP7 compatible)

git-svn-id: trunk@28607 -
2014-09-06 14:56:04 +00:00
nickysn
9b41b10350 * implementation of tiny heap's GetMem changed, so that it doesn't use FreeMem
internally.

git-svn-id: trunk@28580 -
2014-09-01 23:37:00 +00:00
nickysn
cd0acd050e * store the tiny heap free block size in a TP7-compatible way (as a normalized
segment:offset pair, instead of a longint) in the i8086 far data memory models

git-svn-id: trunk@28532 -
2014-08-28 21:24:41 +00:00
nickysn
03a838556f * keep the tiny heap free blocks ordered by start address, instead of size.
Rationale: 1) TP7 compatibility, 2) easier debugging of heap corruption
  problems

git-svn-id: trunk@28518 -
2014-08-24 16:07:01 +00:00
nickysn
70850f0ce6 + tinyheap: check and generate runtime error 204 if an attempt is made to free a
memory block that is outside the heap

git-svn-id: trunk@28446 -
2014-08-18 16:44:34 +00:00
nickysn
9979aa702f + added the TP7-compatible pointer variables HeapOrg and HeapEnd, indicating,
respectively, the start and end of the tiny heap. Eventually they are also
  going to be used for catching attempts to free memory that is outside the
  heap.

git-svn-id: trunk@28437 -
2014-08-17 22:42:44 +00:00
nickysn
7986d0c2ca * simplify RegisterTinyHeapBlock by calling InternalTinyFreeMem directly,
instead of FreeMem. We already do the alignments correctly, so going through
  FreeMem is no longer necessary.

git-svn-id: trunk@28428 -
2014-08-16 22:51:06 +00:00
nickysn
2e0c40d33b * TinyHeapAllocGranularity changed to SizeOf(TTinyHeapBlock). This fixes a bug
where the free blocks may become fragmented, even though all the memory has
  been freed, following certain allocation patterns.

git-svn-id: trunk@28419 -
2014-08-15 22:13:23 +00:00
nickysn
902c25fafa + RegisterTinyHeapBlock: align the start address and size according to
TinyHeapAllocGranularity

git-svn-id: trunk@28418 -
2014-08-15 16:10:22 +00:00
nickysn
815bfe0dcf + tiny heap alloc granularity moved to a constant TinyHeapAllocGranularity
git-svn-id: trunk@28417 -
2014-08-15 15:22:51 +00:00
nickysn
14057ef438 * rm EndAddr from the TTinyHeapBlock structure. This:
1) fixes a bug, which causes the next TTinyHeapBlock to be overwritten after
     freeing a memory block, allocated by GetMem(sizeof(pointer)). This bug was
     exposed after r28391, but was present before that; this commit only made
     the damage worse and, therefore, more visible.
  2) brings the internal heap structure closer to the TP7 heap.

git-svn-id: trunk@28416 -
2014-08-15 00:33:33 +00:00
nickysn
21246e973a * TinyHeapMinBlock defined as sizeof(TTinyHeapBlock), as that's the smallest
free block actually supported

git-svn-id: trunk@28401 -
2014-08-13 08:44:53 +00:00
nickysn
e8c1a44068 * swapped the order of the Next and Size fields in TTinyHeapBlock, because that
brings it closer (but still not equal) to the TP7 heap's internal structure

git-svn-id: trunk@28391 -
2014-08-12 20:38:08 +00:00
nickysn
6720f84d24 + switch to using huge pointers in the tiny heap in the i8086 far data memory
models

git-svn-id: trunk@28333 -
2014-08-07 21:15:56 +00:00
nickysn
9a569b9e57 * use P/TTinyHeapMemBlockSize in RegisterTinyHeapBlock as well
git-svn-id: trunk@28248 -
2014-07-22 12:51:20 +00:00
nickysn
6f8a329b4c * use pointer arithmetic for doing address calculations, with a newly introduced
pointer type TTinyHeapPointerArithmeticType, instead of using ptruint. This
  will allow us to use a huge pointer in i8086 far data memory models, in order
  to allow the heap to exceed 64k.

git-svn-id: trunk@28247 -
2014-07-21 23:02:49 +00:00
nickysn
3b9ab33910 * added type TTinyHeapFreeBlockSize, which holds the size of a free memory block
in the tiny heap

git-svn-id: trunk@28246 -
2014-07-21 17:05:52 +00:00
nickysn
1dc09538d0 * introduce a type TTinyHeapMemBlockSize, which holds the size of an allocated
memory block in the tiny heap

git-svn-id: trunk@28245 -
2014-07-20 16:31:40 +00:00
nickysn
4e2cc365d1 * while loop replaced with a repeat..until loop in InternalTinyFreeMem
git-svn-id: trunk@28161 -
2014-07-05 09:47:59 +00:00
nickysn
640f6ea300 * return nil in SysTinyReallocMem, when the size parameter is 0
git-svn-id: trunk@26892 -
2014-02-26 23:31:50 +00:00
nickysn
858efec84e * handle SysTinyFreeMem(nil) properly (i.e. succeed silently, without writing to
nil pointer memory)

git-svn-id: trunk@26890 -
2014-02-26 22:01:50 +00:00
nickysn
327a15488e * generate a run time error 203 in the tiny heap in case there's not enough
memory for a memory allocation and ReturnNilIfGrowHeapFails is false

git-svn-id: trunk@25727 -
2013-10-09 19:27:55 +00:00
nickysn
6695c8578f * set the TinyHeapMinBlock const relative to the pointer size
git-svn-id: trunk@24521 -
2013-05-16 22:17:05 +00:00
nickysn
f0ada1ccc5 * fixed bug in SysTinyGetMem that caused heap corruption if the free block that's being allocated is followed tightly by an already allocated block
git-svn-id: trunk@24520 -
2013-05-16 22:15:36 +00:00
nickysn
9312419ce8 * fixed heap block start and size alignment in RegisterTinyHeapBlock
git-svn-id: trunk@24519 -
2013-05-16 22:13:35 +00:00