//+--------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1993 - 1994. // // File: cmallspy.hxx // // Contents: CMallocSpy definitions // // Classes: // // Functions: // // History: 24-Oct-94 Created. // //---------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif #define DIM(X) (sizeof(X)/sizeof((X)[0])) class FAR CAddrNode32 { public: void FAR* m_pv; // instance SIZE_T m_cb; // size of allocation in BYTES ULONG m_nAlloc; // the allocation pass count CAddrNode32 FAR *m_pnNext; void FAR* operator new(size_t cb); void operator delete(void FAR* pv); static CAddrNode32 FAR* m_pnFreeList; }; class CMallocSpy : public IMallocSpy { public: CMallocSpy(void); ~CMallocSpy(void); // IUnknown methods STDMETHOD(QueryInterface) (REFIID riid, LPVOID *ppUnk); STDMETHOD_(ULONG, AddRef) (void); STDMETHOD_(ULONG, Release) (void); // IMallocSpy methods STDMETHOD_(SIZE_T, PreAlloc) (SIZE_T cbRequest); STDMETHOD_(void *, PostAlloc) (void *pActual); STDMETHOD_(void *, PreFree) (void *pRequest, BOOL fSpyed); STDMETHOD_(void, PostFree) (BOOL fSpyed); STDMETHOD_(SIZE_T, PreRealloc) (void *pRequest, SIZE_T cbRequest, void **ppNewRequest, BOOL fSpyed); STDMETHOD_(void *, PostRealloc) (void *pActual, BOOL fSpyed); STDMETHOD_(void *, PreGetSize) (void *pRequest, BOOL fSpyed); STDMETHOD_(SIZE_T, PostGetSize) (SIZE_T cbActual, BOOL fSpyed); STDMETHOD_(void *, PreDidAlloc) (void *pRequest, BOOL fSpyed); STDMETHOD_(BOOL, PostDidAlloc) (void *pRequest, BOOL fSpyed, BOOL fActual); STDMETHOD_(void, PreHeapMinimize) (void); STDMETHOD_(void, PostHeapMinimize) (void); private: ULONG m_cRef; BOOL m_fWantTrueSize; UINT m_cHeapChecks; VOID * m_pvRealloc; // block we are throwing away during // a realloc ULONG m_cAllocCalls; // total count of allocation calls CAddrNode32 FAR* m_rganode[1024]; // address instance table // Instance table methods VOID MemInstance(); VOID HeapCheck(); void DelInst(void FAR* pv); CAddrNode32 FAR* FindInst(void FAR* pv); void AddInst(void FAR* pv, SIZE_T cb); void DumpInst(CAddrNode32 FAR* pn); void VerifyHeaderTrailer(CAddrNode32 FAR* pn); inline UINT HashInst(void FAR* pv) const { return ((UINT)((ULONG_PTR)pv >> 4)) % DIM(m_rganode); } BOOL IsEmpty(void); void DumpInstTable(void); void CheckForLeaks(); }; STDAPI GetMallocSpy(IMallocSpy FAR* FAR* ppmallocSpy); #ifdef __cplusplus } #endif