This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
clean up vmem.h, remove unused instrumentation hooks
[perl5.git] / win32 / vmem.h
index 712a76e..8247e43 100644 (file)
@@ -21,7 +21,9 @@
 #ifndef ___VMEM_H_INC___
 #define ___VMEM_H_INC___
 
+#ifndef UNDER_CE
 #define _USE_MSVCRT_MEM_ALLOC
+#endif
 #define _USE_LINKED_LIST
 
 // #define _USE_BUDDY_BLOCKS
@@ -67,9 +69,6 @@ inline void MEMODSlx(char *str, long x)
  * optionaly track by using a doubly linked header
  */
 
-typedef void (*LPFREE)(void *block);
-typedef void* (*LPMALLOC)(size_t size);
-typedef void* (*LPREALLOC)(void *block, size_t size);
 #ifdef _USE_LINKED_LIST
 class VMem;
 typedef struct _MemoryBlockHeader* PMEMORY_BLOCK_HEADER;
@@ -85,14 +84,14 @@ class VMem
 public:
     VMem();
     ~VMem();
-    virtual void* Malloc(size_t size);
-    virtual void* Realloc(void* pMem, size_t size);
-    virtual void Free(void* pMem);
-    virtual void GetLock(void);
-    virtual void FreeLock(void);
-    virtual int IsLocked(void);
-    virtual long Release(void);
-    virtual long AddRef(void);
+    void* Malloc(size_t size);
+     void* Realloc(void* pMem, size_t size);
+     void Free(void* pMem);
+     void GetLock(void);
+     void FreeLock(void);
+     int IsLocked(void);
+     long Release(void);
+     long AddRef(void);
 
     inline BOOL CreateOk(void)
     {
@@ -119,30 +118,20 @@ protected:
     }
 
     MEMORY_BLOCK_HEADER        m_Dummy;
+    CRITICAL_SECTION   m_cs;           // access lock
 #endif
 
     long               m_lRefCount;    // number of current users
-    CRITICAL_SECTION   m_cs;           // access lock
-    HINSTANCE          m_hLib;
-    LPFREE             m_pfree;
-    LPMALLOC           m_pmalloc;
-    LPREALLOC          m_prealloc;
 };
 
 VMem::VMem()
 {
     m_lRefCount = 1;
-    InitializeCriticalSection(&m_cs);
 #ifdef _USE_LINKED_LIST
+    InitializeCriticalSection(&m_cs);
     m_Dummy.pNext = m_Dummy.pPrev =  &m_Dummy;
     m_Dummy.owner = this;
 #endif
-    m_hLib = LoadLibrary("msvcrt.dll");
-    if (m_hLib) {
-       m_pfree = (LPFREE)GetProcAddress(m_hLib, "free");
-       m_pmalloc = (LPMALLOC)GetProcAddress(m_hLib, "malloc");
-       m_prealloc = (LPREALLOC)GetProcAddress(m_hLib, "realloc");
-    }
 }
 
 VMem::~VMem(void)
@@ -151,22 +140,24 @@ VMem::~VMem(void)
     while (m_Dummy.pNext != &m_Dummy) {
        Free(m_Dummy.pNext+1);
     }
-#endif
-    if (m_hLib)
-       FreeLibrary(m_hLib);
     DeleteCriticalSection(&m_cs);
+#endif
 }
 
 void* VMem::Malloc(size_t size)
 {
 #ifdef _USE_LINKED_LIST
     GetLock();
-    PMEMORY_BLOCK_HEADER ptr = (PMEMORY_BLOCK_HEADER)m_pmalloc(size+sizeof(MEMORY_BLOCK_HEADER));
+    PMEMORY_BLOCK_HEADER ptr = (PMEMORY_BLOCK_HEADER)malloc(size+sizeof(MEMORY_BLOCK_HEADER));
+    if (!ptr) {
+       FreeLock();
+       return NULL;
+    }
     LinkBlock(ptr);
     FreeLock();
     return (ptr+1);
 #else
-    return m_pmalloc(size);
+    return malloc(size);
 #endif
 }
 
@@ -184,13 +175,17 @@ void* VMem::Realloc(void* pMem, size_t size)
     GetLock();
     PMEMORY_BLOCK_HEADER ptr = (PMEMORY_BLOCK_HEADER)(((char*)pMem)-sizeof(MEMORY_BLOCK_HEADER));
     UnlinkBlock(ptr);
-    ptr = (PMEMORY_BLOCK_HEADER)m_prealloc(ptr, size+sizeof(MEMORY_BLOCK_HEADER));
+    ptr = (PMEMORY_BLOCK_HEADER)realloc(ptr, size+sizeof(MEMORY_BLOCK_HEADER));
+    if (!ptr) {
+       FreeLock();
+       return NULL;
+    }
     LinkBlock(ptr);
     FreeLock();
 
     return (ptr+1);
 #else
-    return m_prealloc(pMem, size);
+    return realloc(pMem, size);
 #endif
 }
 
@@ -205,7 +200,8 @@ void VMem::Free(void* pMem)
                dTHX;
                int *nowhere = NULL;
                Perl_warn(aTHX_ "Free to wrong pool %p not %p",this,ptr->owner);
-               *nowhere = 0;
+               *nowhere = 0; /* this segfault is deliberate, 
+                                so you can see the stack trace */
 #else
                 ptr->owner->Free(pMem);        
 #endif
@@ -215,22 +211,26 @@ void VMem::Free(void* pMem)
        GetLock();
        UnlinkBlock(ptr);
        ptr->owner = NULL;
-       m_pfree(ptr);
+       free(ptr);
        FreeLock();
     }
-#else
-    m_pfree(pMem);
+#else /*_USE_LINKED_LIST*/
+    free(pMem);
 #endif
 }
 
 void VMem::GetLock(void)
 {
+#ifdef _USE_LINKED_LIST
     EnterCriticalSection(&m_cs);
+#endif
 }
 
 void VMem::FreeLock(void)
 {
+#ifdef _USE_LINKED_LIST
     LeaveCriticalSection(&m_cs);
+#endif
 }
 
 int VMem::IsLocked(void)
@@ -402,14 +402,14 @@ class VMem
 public:
     VMem();
     ~VMem();
-    virtual void* Malloc(size_t size);
-    virtual void* Realloc(void* pMem, size_t size);
-    virtual void Free(void* pMem);
-    virtual void GetLock(void);
-    virtual void FreeLock(void);
-    virtual int IsLocked(void);
-    virtual long Release(void);
-    virtual long AddRef(void);
+     void* Malloc(size_t size);
+     void* Realloc(void* pMem, size_t size);
+     void Free(void* pMem);
+     void GetLock(void);
+     void FreeLock(void);
+     int IsLocked(void);
+     long Release(void);
+     long AddRef(void);
 
     inline BOOL CreateOk(void)
     {
@@ -1034,7 +1034,7 @@ int VMem::HeapAdd(void* p, size_t size
            if(ptr == m_heaps[index].base + (int)m_heaps[index].len) {
                /*
                 * The new block is contiguous with a previously allocated heap area.  Add its
-                * length to that of the previous heap.  Merge it with the the dummy end-of-heap
+                * length to that of the previous heap.  Merge it with the dummy end-of-heap
                 * area marker of the previous heap.
                 */
                m_heaps[index].len += size;