summaryrefslogtreecommitdiffstats
path: root/private/crt32/heap/heapinit.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/crt32/heap/heapinit.c266
1 files changed, 266 insertions, 0 deletions
diff --git a/private/crt32/heap/heapinit.c b/private/crt32/heap/heapinit.c
new file mode 100644
index 000000000..6658596fe
--- /dev/null
+++ b/private/crt32/heap/heapinit.c
@@ -0,0 +1,266 @@
+/***
+*heapinit.c - Initialze the heap
+*
+* Copyright (c) 1989-1993, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+*
+*Revision History:
+* 06-28-89 JCR Module created.
+* 06-30-89 JCR Added _heap_grow_emptylist
+* 11-13-89 GJF Fixed copyright
+* 11-15-89 JCR Moved _heap_abort routine to another module
+* 12-15-89 GJF Removed DEBUG286 stuff, did some tuning, changed header
+* file name to heap.h and made functions explicitly
+* _cdecl.
+* 12-19-89 GJF Removed plastdesc field from _heap_desc_ struct
+* 03-11-90 GJF Replaced _cdecl with _CALLTYPE1, added #include
+* <cruntime.h> and removed #include <register.h>.
+* 07-24-90 SBM Removed '32' from API names
+* 10-03-90 GJF New-style function declarators.
+* 12-04-90 SRW Changed to include <oscalls.h> instead of <doscalls.h>
+* 12-06-90 SRW Added _CRUISER_ and _WIN32 conditionals.
+* 02-01-91 SRW Changed for new VirtualAlloc interface (_WIN32_)
+* 03-05-91 GJF Added definition of _heap_resetsize (conditioned on
+* _OLDROVER_ not being #define-d).
+* 04-04-91 GJF Reduce _heap_regionsize to 1/2 a meg for Dosx32
+* (_WIN32_).
+* 04-05-91 GJF Temporary hack for Win32/DOS folks - special version
+* of _heap_init which calls HeapCreate. The change
+* conditioned on _WIN32DOS_.
+* 04-09-91 PNT Added _MAC_ conditional
+* 02-23-93 SKS Remove DOSX32 support under WIN32 ifdef
+*
+*******************************************************************************/
+
+#ifndef _WIN32DOS_
+
+#include <cruntime.h>
+#include <oscalls.h>
+#include <dos.h>
+#include <heap.h>
+#include <stddef.h>
+#include <stdio.h>
+
+#define _HEAP_EMPTYLIST_SIZE (1 * _PAGESIZE_)
+
+/*
+ * Heap descriptor
+ */
+
+struct _heap_desc_ _heap_desc = {
+ &_heap_desc.sentinel, /* pfirstdesc */
+ &_heap_desc.sentinel, /* proverdesc */
+ NULL, /* emptylist */
+ NULL, /* sentinel.pnextdesc */
+ NULL /* sentinel.pblock */
+ };
+
+/*
+ * Array of region structures
+ * [Note: We count on the fact that this is always initialized to zero
+ * by the compiler.]
+ */
+
+struct _heap_region_ _heap_regions[_HEAP_REGIONMAX];
+
+/*
+ * Control parameter locations
+ */
+
+#ifndef _OLDROVER_
+unsigned int _heap_resetsize = 0xffffffff;
+#endif /* _OLDROVER_ */
+
+/* NOTE: Currenlty, _heap_growsize is a #define to _amblksiz */
+unsigned int _heap_growsize = _HEAP_GROWSIZE; /* region inc size */
+unsigned int _heap_regionsize = _HEAP_REGIONSIZE; /* region size */
+
+
+/***
+*_heap_init() - Initialize the heap
+*
+*Purpose:
+* Setup the initial C library heap. All necessary memory and
+* data bases are init'd appropriately so future requests work
+* correctly.
+*
+* NOTES:
+* (1) This routine should only be called once!
+* (2) This routine must be called before any other heap requests.
+*
+*
+*Entry:
+* <void>
+*Exit:
+* <void>
+*
+*Exceptions:
+* If heap cannot be initialized, the program will be terminated
+* with a fatal runtime error.
+*
+*******************************************************************************/
+
+void _CALLTYPE1 _heap_init (
+ void
+ )
+{
+#ifdef _CRUISER_
+
+ /*
+ * Currently nothing to do to init the 386 heap!!!
+ * If this stays true, we can get rid of the _heapinit call
+ * in startup and remove this module!
+ */
+
+#else /* ndef _CRUISER*/
+
+#ifdef _WIN32_
+
+ /*
+ * Currently nothing to do to init the 386 heap!!!
+ * If this stays true, we can get rid of the _heapinit call
+ * in startup and remove this module!
+ */
+
+#else /* ndef _WIN32_ */
+
+#error ERROR - ONLY CRUISER OR WIN32 TARGET SUPPORTED!
+
+#endif /* _WIN32_ */
+
+#endif /* _CRUISER_ */
+
+}
+
+
+
+/***
+* _heap_grow_emptylist() - Grow the empty heap descriptor list
+*
+*Purpose:
+* (1) Get memory from OS
+* (2) Form it into a linked list of empty heap descriptors
+* (3) Attach it to the master empty list
+*
+* NOTE: This routine assumes that the emptylist is NULL
+* when called (i.e., there are no available empty heap descriptors).
+*
+*Entry:
+* (void)
+*
+*Exit:
+* (void)
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+void _CALLTYPE1 _heap_grow_emptylist (
+ void
+ )
+{
+ REG1 _PBLKDESC first;
+ REG2 _PBLKDESC next;
+ _PBLKDESC last;
+
+
+ /*
+ * Get memory for the new empty heap descriptors
+ *
+ * Note that last is used to hold the returned pointer because
+ * first (and next) are register class.
+ */
+
+#ifdef _CRUISER_
+
+ if ( DOSALLOCMEM(&last, _HEAP_EMPTYLIST_SIZE, _COMMIT, 0) != 0 )
+ _heap_abort();
+
+#else /* ndef _CRUISER_ */
+
+#ifdef _WIN32_
+
+ if (!(last = VirtualAlloc(NULL, _HEAP_EMPTYLIST_SIZE, MEM_COMMIT,
+ PAGE_READWRITE)))
+ _heap_abort();
+
+#else /* ndef _WIN32_ */
+
+#ifdef _MAC_
+
+ TBD();
+
+#else /* ndef _MAC_ */
+
+#error ERROR - ONLY CRUISER, WIN32, OR MAC TARGET SUPPORTED!
+
+#endif /* _MAC_ */
+
+#endif /* _WIN32_ */
+
+#endif /* _CRUISER_ */
+
+ /*
+ * Init the empty heap descriptor list.
+ */
+
+ _heap_desc.emptylist = first = last;
+
+
+ /*
+ * Carve the memory into an empty list
+ */
+
+ last = (_PBLKDESC) ((char *) first + _HEAP_EMPTYLIST_SIZE - sizeof(_BLKDESC));
+ next = (_PBLKDESC) ((char *) first + sizeof(_BLKDESC));
+
+ while ( first < last ) {
+
+ /* Init this descriptor */
+#ifdef DEBUG
+ first->pblock = NULL;
+#endif
+ first->pnextdesc = next;
+
+ /* onto the next block */
+
+ first = next++;
+
+ }
+
+ /*
+ * Take care of the last descriptor (end of the empty list)
+ */
+
+ last->pnextdesc = NULL;
+
+#ifdef DEBUG
+ last->pblock = NULL;
+#endif
+
+}
+
+#else /* _WIN32DOS_ */
+
+/*
+ * TEMPORARY HACK! THE CODE BELOW IS INTENDED TO ALLOW LIMITED USE OF THE
+ * C RUNTIME ON WIN32/DOS. IT WILL BE DELETED AS SOON AS THEY IMPLEMENT
+ * VirtualAlloc()!
+ */
+
+#include <cruntime.h>
+#include <oscalls.h>
+#include <heap.h>
+
+HANDLE _HeapHandle;
+
+void _CALLTYPE1 _heap_init (
+ void
+ )
+{
+ if ( (_HeapHandle = HeapCreate(HEAP_SERIALIZE, 0x10000, 0)) == NULL )
+ _heap_abort();
+}
+
+#endif /* _WIN32DOS_ */