FMemStats.h 3.58 KB
Newer Older
1
// ===================================================================================
2 3 4 5 6 7 8 9
// Logiciel initial: ScalFmm Version 0.5
// Co-auteurs : Olivier Coulaud, Bérenger Bramas.
// Propriétaires : INRIA.
// Copyright © 2011-2012, diffusé sous les termes et conditions d’une licence propriétaire.
// Initial software: ScalFmm Version 0.5
// Co-authors: Olivier Coulaud, Bérenger Bramas.
// Owners: INRIA.
// Copyright © 2011-2012, spread under the terms and conditions of a proprietary license.
10
// ===================================================================================
11 12 13
#ifndef FMEMSTATS_H
#define FMEMSTATS_H

14
#include "FGlobal.hpp"
15

16
#include <cstdlib>
17
#include <cstring>
18

19 20 21 22 23 24

/** 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
  */

25
#ifdef SCALFMM_USE_MEM_STATS
26 27
#include <new>
#include <stdexcept>
28
#warning You are using meme stats
29 30 31 32 33 34 35 36 37 38
    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

39 40 41
/** Give the memory allocation details
  *
  */
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
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;
    }

65
#ifdef SCALFMM_USE_MEM_STATS
66 67 68 69 70 71 72 73
    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();
74
#endif
75 76

public:
77
    /** Singleton */
78 79
    static FMemStats controler;

80
    /** return the max that has been allocated */
81 82 83 84
    unsigned long long getMaxAllocated() const{
        return maxAllocated;
    }

85
    /** return the total memory allocated during the running */
86 87 88 89
    unsigned long long getTotalAllocated() const{
        return totalAllocated;
    }

90
    /** return the current size allcoated */
91 92 93
    std::size_t getCurrentAllocated() const{
        return currentAllocated;
    }
94

95
    /** get the max in MB */
96 97 98 99
    float getMaxAllocatedMB() const{
        return float(getMaxAllocated()) / 1024 / 1024;
    }

100
    /** get the total in MB */
101 102 103 104
    float getTotalAllocatedMB() const{
        return float(getTotalAllocated()) / 1024 / 1024;
    }

105
    /** get the current in MB */
106 107 108
    float getCurrentAllocatedMB() const{
        return float(getCurrentAllocated()) / 1024 / 1024;
    }
109

110
    /** To know if mem stat has been enabled */
111 112 113 114 115 116 117
    bool isUsed() const {
#ifdef SCALFMM_USE_MEM_STATS
        return true;
#else
        return false;
#endif
    }
118 119 120 121
};


#endif // FMEMSTATS_H