diff options
Diffstat (limited to 'private/crt32/heap/free.c')
-rw-r--r-- | private/crt32/heap/free.c | 171 |
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_ */ |