| #pragma once |
| |
| #ifndef _TBIGMEMORYMANAGER_ |
| #define _TBIGMEMORYMANAGER_ |
| |
| class Chunkinfo; |
| |
| #undef DVAPI |
| #undef DVVAR |
| #ifdef TSYSTEM_EXPORTS |
| #define DVAPI DV_EXPORT_API |
| #define DVVAR DV_EXPORT_VAR |
| #else |
| #define DVAPI DV_IMPORT_API |
| #define DVVAR DV_IMPORT_VAR |
| #endif |
| |
| #include "tcommon.h" |
| #include "tthreadmessage.h" |
| class TRaster; |
| |
| class DVAPI TBigMemoryManager |
| { |
| TThread::Mutex m_mutex; |
| UCHAR *m_theMemory; |
| std::map<UCHAR *, Chunkinfo> m_chunks; |
| UCHAR *allocate(UINT &size); |
| |
| TUINT32 m_availableMemory, m_allocatedMemory; |
| std::map<UCHAR *, Chunkinfo>::iterator shiftBlock(const std::map<UCHAR *, Chunkinfo>::iterator &it, TUINT32 offset); |
| TRaster *findRaster(TRaster *ras); |
| void checkConsistency(); |
| UCHAR *remap(TUINT32 RequestedSize); |
| void printLog(TUINT32 size); |
| |
| public: |
| TBigMemoryManager(); |
| ~TBigMemoryManager(); |
| bool init(TUINT32 sizeinKb); |
| bool putRaster(TRaster *ras, bool canPutOnDisk = true); |
| bool releaseRaster(TRaster *ras); |
| void lock(UCHAR *buffer); |
| void unlock(UCHAR *buffer); |
| UCHAR *getBuffer(UINT size); |
| static TBigMemoryManager *instance(); |
| bool isActive() const { return m_theMemory != 0; } |
| |
| TUINT32 getAvailableMemoryinKb() const |
| { |
| assert(m_theMemory != 0); |
| return m_availableMemory >> 10; |
| } |
| void getRasterInfo(int &rasterCount, TUINT32 &totRasterMemInKb, int ¬CachedRasterCount, TUINT32 ¬CachedRasterMemInKb); |
| #ifdef _DEBUG |
| TUINT32 m_totRasterMemInKb; |
| void printMap(); |
| #endif |
| int getAllocationPeak(); |
| int getAllocationMean(); |
| |
| void setRunOutOfContiguousMemoryHandler(void (*callback)(unsigned long size)); |
| |
| private: |
| friend class TRaster; |
| void (*m_runOutCallback)(unsigned long); |
| }; |
| |
| #endif |