summaryrefslogtreecommitdiffstats
path: root/private/crt32/heap/free.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/heap/free.c')
-rw-r--r--private/crt32/heap/free.c171
1 files changed, 171 insertions, 0 deletions
diff --git a/private/crt32/heap/free.c b/private/crt32/heap/free.c
new file mode 100644
index 000000000..44e44475a
--- /dev/null
+++ b/private/crt32/heap/free.c
@@ -0,0 +1,171 @@
+/***
+*free.c - free an entry in the heap
+*
+* Copyright (c) 1989-1991, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Defines the following functions:
+* free() - free a memory block in the heap
+* _free_lk() - non-locking from of free() (multi-thread only)
+*
+*Revision History:
+* 06-30-89 JCR Module created
+* 07-07-89 GJF Fixed test for resetting proverdesc
+* 11-10-89 GJF Added MTHREAD support. Also, a little cleanup.
+* 12-18-89 GJF Change header file name to heap.h, added register
+* declarations and added explicit _cdecl to function
+* definitions
+* 03-09-90 GJF Replaced _cdecl with _CALLTYPE1, added #include
+* <cruntime.h> and removed #include <register.h>.
+* 09-27-90 GJF New-style function declarators. Also, rewrote expr.
+* so that a cast was not used as an lvalue.
+* 03-05-91 GJF Changed strategy for rover - old version available
+* by #define-ing _OLDROVER_.
+* 04-08-91 GJF Temporary hack for Win32/DOS folks - special version
+* of free that just calls HeapFree. Change conditioned
+* on _WIN32DOS_.
+*
+*******************************************************************************/
+
+#ifndef _WIN32DOS_
+
+#include <cruntime.h>
+#include <heap.h>
+#include <malloc.h>
+#include <os2dll.h>
+#include <stdlib.h>
+
+/***
+*void free(pblock) - free a block in the heap
+*
+*Purpose:
+* Free a memory block in the heap.
+*
+* Special Notes For Multi-thread: The non-multi-thread version is renamed
+* to _free_lk(). The multi-thread free() simply locks the heap, calls
+* _free_lk(), then unlocks the heap and returns.
+*
+*Entry:
+* void *pblock - pointer to a memory block in the heap
+*
+*Return:
+* <void>
+*
+*******************************************************************************/
+
+#ifdef MTHREAD
+
+void _CALLTYPE1 free (
+ void *pblck
+ )
+{
+ /* lock the heap
+ */
+ _mlock(_HEAP_LOCK);
+
+ /* free the block
+ */
+ _free_lk(pblck);
+
+ /* unlock the heap
+ */
+ _munlock(_HEAP_LOCK);
+}
+
+
+/***
+*void _free_lk(pblock) - non-locking form of free
+*
+*Purpose:
+* Same as free() except that no locking is performed
+*
+*Entry:
+* See free
+*
+*Return:
+*
+*******************************************************************************/
+
+void _CALLTYPE1 _free_lk (
+
+#else /* ndef MTHREAD */
+
+void _CALLTYPE1 free (
+
+#endif /* MTHREAD */
+
+ REG1 void *pblck
+ )
+{
+ REG2 _PBLKDESC pdesc;
+
+ /*
+ * If the pointer is NULL, just return [ANSI].
+ */
+
+ if (pblck == NULL)
+ return;
+
+ /*
+ * Point to block header and get the pointer back to the heap desc.
+ */
+
+ pblck = (char *)pblck - _HDRSIZE;
+ pdesc = *(_PBLKDESC*)pblck;
+
+ /*
+ * Validate the back pointer.
+ */
+
+ if (_ADDRESS(pdesc) != pblck)
+ _heap_abort();
+
+ /*
+ * Pointer is ok. Mark block free.
+ */
+
+ _SET_FREE(pdesc);
+
+ /*
+ * Back up rover pointer, if appropriate.
+ */
+#ifdef _OLDROVER_
+
+ if (_heap_desc.proverdesc->pblock > pdesc->pblock)
+ _heap_desc.proverdesc = pdesc;
+
+#else /* ndef _OLDROVER_ */
+
+ if ( (_heap_resetsize != 0xffffffff) &&
+ (_heap_desc.proverdesc->pblock > pdesc->pblock) &&
+ (_BLKSIZE(pdesc) >= _heap_resetsize) )
+ _heap_desc.proverdesc = pdesc;
+
+#endif /* _OLDROVER_ */
+
+}
+
+
+#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 <malloc.h>
+
+extern HANDLE _HeapHandle;
+
+void _CALLTYPE1 free (
+ void *pblck
+ )
+{
+ HeapFree(_HeapHandle, pblck);
+ return;
+}
+
+#endif /* _WIN32DOS_ */