157 lines
3.9 KiB
C++
157 lines
3.9 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1992 - 1993.
|
|
//
|
|
// File: DfMem.HXX
|
|
//
|
|
// Contents: Memory headers
|
|
//
|
|
// Functions: DfCreateSharedAllocator
|
|
// new (DBG only)
|
|
// delete (DBG only)
|
|
//
|
|
// Classes: CMallocBased
|
|
// CLocalAlloc
|
|
//
|
|
// History: 18-May-93 AlexT Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#ifndef __DFMEM_HXX__
|
|
#define __DFMEM_HXX__
|
|
|
|
#ifndef _HEAP_MAXREQ
|
|
# define _HEAP_MAXREQ 0xffffffff // from 16-bit malloc.h
|
|
#endif
|
|
|
|
#if defined(WIN32)
|
|
|
|
#define TaskMemAlloc CoTaskMemAlloc
|
|
#define TaskMemFree CoTaskMemFree
|
|
|
|
// Creating the shared memory indirects through a pointer for most
|
|
// efficient once-per-process initialisation
|
|
extern HRESULT DfCreateSharedAllocator (IMalloc **ppm, BOOL fTaskMemory);
|
|
|
|
// Constants related to the Docfile shared memory
|
|
#define DOCFILE_SM_NAME L"XXYZZY1OleSharedHeap"
|
|
#ifdef MULTIHEAP
|
|
#ifdef _WIN64
|
|
#define DOCFILE_SM_SIZE 0x1000000L /* 16 Meg */
|
|
#define DOCFILE_SM_LIMIT 0x80000000L /* 2 Gig */
|
|
#else
|
|
#define DOCFILE_SM_SIZE 0x400000L /* 4 Meg */
|
|
#define DOCFILE_SM_LIMIT 0x40000000L /* 1 Gig */
|
|
#endif // _WIN64
|
|
#else
|
|
#define DOCFILE_SM_SIZE 0x4000000L
|
|
#endif
|
|
#define DOCFILE_SM_NAMELEN 32
|
|
|
|
#else // 16 bit
|
|
|
|
// Use TaskMemAlloc and TaskMemFree for allocations that may be returned
|
|
|
|
extern void *TaskMemAlloc(ULONG ulcb);
|
|
extern void TaskMemFree(void *pv);
|
|
|
|
# if DBG==0
|
|
# define DfCreateSharedAllocator(ppm, fTaskmemory) \
|
|
CoCreateStandardMalloc(MEMCTX_SHARED, ppm)
|
|
# else
|
|
extern HRESULT DfCreateSharedAllocator(IMalloc **ppm, BOOL fTaskMemory);
|
|
# endif
|
|
|
|
#endif // defined(WIN32)
|
|
|
|
|
|
class CMallocBased
|
|
{
|
|
public:
|
|
void *operator new(size_t size, IMalloc * const pMalloc);
|
|
|
|
void operator delete(void *pv);
|
|
// deallocate the memory without Mutex
|
|
// (requires that the MUtex is already locked)
|
|
void deleteNoMutex(void *pv);
|
|
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CLocalAlloc
|
|
//
|
|
// Purpose: Base class for classes allocated in task local memory.
|
|
//
|
|
// Interface: See below.
|
|
//
|
|
// History: 17-Aug-92 PhilipLa Created.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CLocalAlloc
|
|
{
|
|
public:
|
|
#if DBG==0 || defined(MULTIHEAP)
|
|
inline
|
|
#endif
|
|
void *operator new(size_t size);
|
|
|
|
#if DBG==0 || defined(MULTIHEAP)
|
|
inline
|
|
#endif
|
|
void operator delete(void *pv);
|
|
};
|
|
|
|
#if DBG==0 || defined(MULTIHEAP)
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CLocalAlloc::operator new, public
|
|
//
|
|
// Synopsis: Overloaded new operator to allocate objects from
|
|
// task local space.
|
|
//
|
|
// Arguments: [size] -- Size of block to allocate
|
|
//
|
|
// Returns: Pointer to memory allocated.
|
|
//
|
|
// History: 17-Aug-92 PhilipLa Created.
|
|
// 18-May-93 AlexT Switch to task IMalloc
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
inline void *CLocalAlloc::operator new(size_t size)
|
|
{
|
|
return TaskMemAlloc(size);
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Method: CLocalAlloc::operator delete, public
|
|
//
|
|
// Synopsis: Free memory from task local space
|
|
//
|
|
// Arguments: [pv] -- Pointer to memory to free
|
|
//
|
|
// History: 17-Aug-92 PhilipLa Created.
|
|
// 18-May-93 AlexT Switch to task IMalloc
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
inline void CLocalAlloc::operator delete(void *pv)
|
|
{
|
|
TaskMemFree(pv);
|
|
}
|
|
|
|
#endif // DBG == 0 || defined(MULTIHEAP)
|
|
|
|
// Use DfMemAlloc and DfMemFree for tempory allocations
|
|
|
|
#define DfMemAlloc(cb) CLocalAlloc::operator new((size_t) (cb))
|
|
#define DfMemFree(pv) delete (CLocalAlloc *) (pv)
|
|
|
|
|
|
#endif // #ifndef __DFMEM_HXX__
|