summaryrefslogtreecommitdiff
path: root/NetWare/nwvmem.h
diff options
context:
space:
mode:
Diffstat (limited to 'NetWare/nwvmem.h')
-rw-r--r--NetWare/nwvmem.h340
1 files changed, 340 insertions, 0 deletions
diff --git a/NetWare/nwvmem.h b/NetWare/nwvmem.h
new file mode 100644
index 0000000000..5999d88381
--- /dev/null
+++ b/NetWare/nwvmem.h
@@ -0,0 +1,340 @@
+
+/*
+ * Copyright © 2001 Novell, Inc. All Rights Reserved.
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the README file.
+ *
+ */
+
+/*
+ * FILENAME : NWVMem.h
+ * DESCRIPTION : Memory management for Perl Interpreter on NetWare.
+ * Watcom's hash table is used to store memory pointers.
+ * All malloc's, realloc's, free's go through this.
+ * Author : HYAK, SGP
+ * Date : Januray 2001.
+ *
+ */
+
+
+
+#ifndef ___NWVMEM_H_INC___
+#define ___NWVMEM_H_INC___
+
+
+#include "win32ish.h" // For "BOOL", "TRUE" and "FALSE"
+#include <nwhashcls.h> // CW changes
+#include <nwmalloc.h>
+#include "string.h"
+
+
+
+class VMem
+{
+public:
+ VMem();
+ virtual ~VMem();
+ virtual void* Malloc(size_t size);
+ virtual void* Realloc(void* pMem, size_t size);
+ virtual void Free(void* pMem);
+ virtual void* Calloc(size_t num, size_t size);
+
+protected:
+ BOOL m_dontTouchHashLists;
+// WCValHashTable<void*>* m_allocList;
+ NWPerlHashList *m_allocList; // CW changes
+};
+
+
+
+
+/*============================================================================================
+
+ Function : fnAllocListHash
+
+ Description : Hashing function for hash table of memory allocations.
+
+ Parameters : invalue (IN).
+
+ Returns : unsigned.
+
+==============================================================================================*/
+
+unsigned fnAllocListHash(void* const& invalue)
+{
+ return (((unsigned) invalue & 0x0000ff00) >> 8);
+}
+
+
+
+/*============================================================================================
+
+ Function : fnFreeMemEntry
+
+ Description : Called for each outstanding memory allocation at the end of a script run.
+ Frees the outstanding allocations
+
+ Parameters : ptr (IN).
+ context (IN)
+
+ Returns : Nothing.
+
+==============================================================================================*/
+
+void fnFreeMemEntry(void* ptr, void* context)
+{
+ VMem* pVMem = (VMem*) context;
+
+ if(ptr && pVMem)
+ {
+ pVMem->Free(ptr);
+ ptr=NULL;
+ pVMem = NULL;
+ context = NULL;
+ }
+}
+
+
+
+/*============================================================================================
+
+ Function : VMem Constructor
+
+ Description :
+
+ Parameters :
+
+ Returns :
+
+==============================================================================================*/
+
+VMem::VMem()
+{
+ //Constructor
+ m_dontTouchHashLists = FALSE;
+ m_allocList = NULL;
+ // m_allocList = new WCValHashTable<void*> (fnAllocListHash, 256);
+ m_allocList = new NWPerlHashList(); // CW changes
+}
+
+
+
+/*============================================================================================
+
+ Function : VMem Destructor
+
+ Description :
+
+ Parameters :
+
+ Returns :
+
+==============================================================================================*/
+
+VMem::~VMem(void)
+{
+ //Destructor
+ m_dontTouchHashLists = TRUE;
+ if (m_allocList)
+ {
+ m_allocList->forAll(fnFreeMemEntry, (void*) this);
+
+ delete m_allocList;
+ m_allocList = NULL;
+ }
+ m_dontTouchHashLists = FALSE;
+}
+
+
+
+/*============================================================================================
+
+ Function : VMem::Malloc
+
+ Description : Allocates memory.
+
+ Parameters : size (IN) - Size of memory to be allocated.
+
+ Returns : Pointer to the allocated memory block.
+
+==============================================================================================*/
+
+void* VMem::Malloc(size_t size)
+{
+ void *ptr = NULL;
+
+ if (size <= 0)
+ return NULL;
+
+ ptr = malloc(size);
+ if (ptr)
+ {
+ if(m_allocList)
+ m_allocList->insert(ptr);
+ }
+ else
+ {
+ m_dontTouchHashLists = TRUE;
+ if (m_allocList)
+ {
+ m_allocList->forAll(fnFreeMemEntry, (void*) this);
+ delete m_allocList;
+ m_allocList = NULL;
+ }
+ m_dontTouchHashLists = FALSE;
+
+ // Serious error since memory allocation falied. So, exiting...
+ ExitThread(TSR_THREAD, 1);
+ }
+
+ return(ptr);
+}
+
+
+
+/*============================================================================================
+
+ Function : VMem::Realloc
+
+ Description : Reallocates block of memory.
+
+ Parameters : block (IN) - Points to a previously allocated memory block.
+ size (IN) - Size of memory to be allocated.
+
+ Returns : Pointer to the allocated memory block.
+
+==============================================================================================*/
+
+void* VMem::Realloc(void* block, size_t size)
+{
+ void *ptr = NULL;
+
+ if (size <= 0)
+ return NULL;
+
+ ptr = realloc(block, size);
+ if (ptr)
+ {
+ if (block)
+ {
+ if (m_allocList)
+ m_allocList->remove(block);
+ }
+ if (m_allocList)
+ m_allocList->insert(ptr);
+ }
+ else
+ {
+ m_dontTouchHashLists = TRUE;
+ if (m_allocList)
+ {
+ m_allocList->forAll(fnFreeMemEntry, (void*) this);
+ delete m_allocList;
+ m_allocList = NULL;
+ }
+ m_dontTouchHashLists = FALSE;
+
+ // Serious error since memory allocation falied. So, exiting...
+ ExitThread(TSR_THREAD, 1);
+ }
+
+ return(ptr);
+}
+
+
+
+/*============================================================================================
+
+ Function : VMem::Calloc
+
+ Description : Allocates and clears memory space for an array of objects.
+
+ Parameters : num (IN) - Specifies the number of objects.
+ size (IN) - Size of each object.
+
+ Returns : Pointer to the allocated memory block.
+
+==============================================================================================*/
+
+void* VMem::Calloc(size_t num, size_t size)
+{
+ void *ptr = NULL;
+
+ if (size <= 0)
+ return NULL;
+
+ ptr = calloc(num, size);
+ if (ptr)
+ {
+ if(m_allocList)
+ m_allocList->insert(ptr);
+ }
+ else
+ {
+ m_dontTouchHashLists = TRUE;
+ if (m_allocList)
+ {
+ m_allocList->forAll(fnFreeMemEntry, (void*) this);
+ delete m_allocList;
+ m_allocList = NULL;
+ }
+ m_dontTouchHashLists = FALSE;
+
+ // Serious error since memory allocation falied. So, exiting...
+ ExitThread(TSR_THREAD, 1);
+ }
+
+ return(ptr);
+}
+
+
+
+/*============================================================================================
+
+ Function : VMem::Free
+
+ Description : Frees allocated memory.
+
+ Parameters : p (IN) - Points to the allocated memory.
+
+ Returns : Nothing.
+
+==============================================================================================*/
+
+void VMem::Free(void* p)
+{
+ // Final clean up, free all the nodes from the hash list
+ if (m_dontTouchHashLists)
+ {
+ if(p)
+ {
+ free(p);
+ p = NULL;
+ }
+ }
+ else
+ {
+ if(p && m_allocList)
+ {
+ if (m_allocList->remove(p))
+ {
+ free(p);
+ p = NULL;
+ }
+ else
+ {
+ // If it comes here, that means that the memory pointer is not contained in the hash list.
+ // But no need to free now, since if is deleted here, it will result in an abend!!
+ // If the memory is still there, it will be cleaned during final cleanup anyway.
+ }
+ }
+ }
+
+
+ return;
+}
+
+
+#endif //___NWVMEM_H_INC___
+