FMemStats.h 2.95 KB
Newer Older
1 2 3
#ifndef FMEMSTATS_H
#define FMEMSTATS_H

4
#include "FGlobal.hpp"
5

6
#include <cstdlib>
7
#include <cstring>
8

9 10 11 12 13 14

/** Memstat has to be enabled in the cmake,
  * then it will use the know each allocate and deallocate
  * and give simple stats like max, total used, current used
  */

15
#ifdef SCALFMM_USE_MEM_STATS
16 17
#include <new>
#include <stdexcept>
18
#warning You are using meme stats
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
    void* operator new(std::size_t n) throw(std::bad_alloc);
    void* operator new(size_t n, std::nothrow_t const&) throw();
    void* operator new[](size_t n) throw(std::bad_alloc);
    void* operator new[](size_t n, std::nothrow_t const&) throw();
    void operator delete(void* p) throw();
    void operator delete(void* p, std::nothrow_t const&) throw();
    void operator delete[](void* p) throw();
    void operator delete[](void* p, std::nothrow_t const&) throw();
#endif

class FMemStats {
private:
    unsigned long long maxAllocated;
    unsigned long long totalAllocated;
    std::size_t currentAllocated;

    FMemStats()
        : maxAllocated(0), totalAllocated(0), currentAllocated(0) {
    }

    void allocate(const std::size_t size){
        currentAllocated += size;
        totalAllocated += size;

        if(maxAllocated < currentAllocated){
            maxAllocated = currentAllocated;
        }
    }

    void deallocate(const std::size_t size){
        currentAllocated -= size;
    }

52
#ifdef SCALFMM_USE_MEM_STATS
53 54 55 56 57 58 59 60
    friend void* operator new(std::size_t n) throw(std::bad_alloc);
    friend void* operator new(size_t n, std::nothrow_t const&) throw();
    friend void* operator new[](size_t n) throw(std::bad_alloc);
    friend void* operator new[](size_t n, std::nothrow_t const&) throw();
    friend void operator delete(void* p) throw();
    friend void operator delete(void* p, std::nothrow_t const&) throw();
    friend void operator delete[](void* p) throw();
    friend void operator delete[](void* p, std::nothrow_t const&) throw();
61
#endif
62 63

public:
64
    /** Singleton */
65 66
    static FMemStats controler;

67
    /** return the max that has been allocated */
68 69 70 71
    unsigned long long getMaxAllocated() const{
        return maxAllocated;
    }

72
    /** return the total memory allocated during the running */
73 74 75 76
    unsigned long long getTotalAllocated() const{
        return totalAllocated;
    }

77
    /** return the current size allcoated */
78 79 80
    std::size_t getCurrentAllocated() const{
        return currentAllocated;
    }
81

82
    /** get the max in MB */
83 84 85 86
    float getMaxAllocatedMB() const{
        return float(getMaxAllocated()) / 1024 / 1024;
    }

87
    /** get the total in MB */
88 89 90 91
    float getTotalAllocatedMB() const{
        return float(getTotalAllocated()) / 1024 / 1024;
    }

92
    /** get the current in MB */
93 94 95
    float getCurrentAllocatedMB() const{
        return float(getCurrentAllocated()) / 1024 / 1024;
    }
96

97
    /** To know if mem stat has been enabled */
98 99 100 101 102 103 104
    bool isUsed() const {
#ifdef SCALFMM_USE_MEM_STATS
        return true;
#else
        return false;
#endif
    }
105 106 107 108
};


#endif // FMEMSTATS_H