root/src/system/libroot/posix/malloc/hoard2/heapstats.h
///-*-C++-*-//////////////////////////////////////////////////////////////////
//
// Hoard: A Fast, Scalable, and Memory-Efficient Allocator
//        for Shared-Memory Multiprocessors
// Contact author: Emery Berger, http://www.cs.utexas.edu/users/emery
//
// Copyright (c) 1998-2000, The University of Texas at Austin.
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Library General Public License as
// published by the Free Software Foundation, http://www.fsf.org.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Library General Public License for more details.
//
//////////////////////////////////////////////////////////////////////////////
#ifndef _HEAPSTATS_H_
#define _HEAPSTATS_H_

#include "config.h"

//#include <stdio.h>
//#include <assert.h>


class heapStats {
        public:
                heapStats(void)
                        : U(0), A(0)
#if HEAP_STATS
                        , Umax(0), Amax(0)
#endif
                {
                }

                inline const heapStats & operator=(const heapStats & p);

                inline void incStats(int updateU, int updateA);
                inline void incUStats(void);

                inline void decStats(int updateU, int updateA);
                inline void decUStats(void);
                inline void decUStats(int &Uout, int &Aout);

                inline void getStats(int &Uout, int &Aout);

#if HEAP_STATS
                inline int getUmax(void);
                inline int getAmax(void);
#endif

        private:
                // U and A *must* be the first items in this class --
                // we will depend on this to atomically update them.

                int U;                                          // Memory in use.
                int A;                                          // Memory allocated.

#if HEAP_STATS
                int Umax;
                int Amax;
#endif
};


inline void
heapStats::incStats(int updateU, int updateA)
{
        assert(updateU >= 0);
        assert(updateA >= 0);
        assert(U <= A);
        assert(U >= 0);
        assert(A >= 0);
        U += updateU;
        A += updateA;

#if HEAP_STATS
        Amax = MAX(Amax, A);
        Umax = MAX(Umax, U);
#endif

        assert(U <= A);
        assert(U >= 0);
        assert(A >= 0);
}


inline void
heapStats::incUStats(void)
{
        assert(U < A);
        assert(U >= 0);
        assert(A >= 0);
        U++;

#if HEAP_STATS
        Umax = MAX(Umax, U);
#endif

        assert(U >= 0);
        assert(A >= 0);
}


inline void
heapStats::decStats(int updateU, int updateA)
{
        assert(updateU >= 0);
        assert(updateA >= 0);
        assert(U <= A);
        assert(U >= updateU);
        assert(A >= updateA);
        U -= updateU;
        A -= updateA;
        assert(U <= A);
        assert(U >= 0);
        assert(A >= 0);
}


inline void
heapStats::decUStats(int &Uout, int &Aout)
{
        assert(U <= A);
        assert(U > 0);
        assert(A >= 0);
        U--;
        Uout = U;
        Aout = A;
        assert(U >= 0);
        assert(A >= 0);
}


inline void
heapStats::decUStats(void)
{
        assert(U <= A);
        assert(U > 0);
        assert(A >= 0);
        U--;
}


inline void
heapStats::getStats(int &Uout, int &Aout)
{
        assert(U >= 0);
        assert(A >= 0);
        Uout = U;
        Aout = A;
        assert(U <= A);
        assert(U >= 0);
        assert(A >= 0);
}


#if HEAP_STATS
inline int
heapStats::getUmax(void)
{
        return Umax;
}


inline int
heapStats::getAmax(void)
{
        return Amax;
}
#endif // HEAP_STATS

#endif // _HEAPSTATS_H_