text: /*
   * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License version 2 only, as
   * published by the Free Software Foundation.
   *
   * This code 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 General Public License
   * version 2 for more details (a copy is included in the LICENSE file that
   * accompanied this code).
   *
   * You should have received a copy of the GNU General Public License version
   * 2 along with this work; if not, write to the Free Software Foundation,
   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
   *
   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
   * or visit www.oracle.com if you need additional information or have any
   * questions.
   *
   */
  
  #ifndef SHARE_VM_GC_IMPLEMENTATION_SHARED_CSPACECOUNTERS_HPP
  #define SHARE_VM_GC_IMPLEMENTATION_SHARED_CSPACECOUNTERS_HPP
  
  #include "gc_implementation/shared/generationCounters.hpp"
  #include "memory/space.inline.hpp"
  #include "runtime/perfData.hpp"
  
  // A CSpaceCounters is a holder class for performance counters
  // that track a space;
  
  class CSpaceCounters: public CHeapObj {
    friend class VMStructs;
  
   private:
    PerfVariable*      _capacity;
    PerfVariable*      _used;
  
    // Constant PerfData types don't need to retain a reference.
    // However, it's a good idea to document them here.
    // PerfConstant*     _size;
  
    ContiguousSpace*     _space;
    char*                _name_space;
  
   public:
  
    CSpaceCounters(const char* name, int ordinal, size_t max_size,
                   ContiguousSpace* s, GenerationCounters* gc);
  
    ~CSpaceCounters() {
        if (_name_space != NULL) FREE_C_HEAP_ARRAY(char, _name_space);
    }
  
    inline void update_capacity() {
      _capacity->set_value(_space->capacity());
    }
  
    inline void update_used() {
      _used->set_value(_space->used());
    }
  
    inline void update_all() {
      update_used();
      update_capacity();
    }
  
    const char* name_space() const        { return _name_space; }
  };
  
  class ContiguousSpaceUsedHelper : public PerfLongSampleHelper {
    private:
      ContiguousSpace* _space;
  
    public:
      ContiguousSpaceUsedHelper(ContiguousSpace* space) : _space(space) { }
  
      inline jlong take_sample() {
        return _space->used();
      }
  };
  
  #endif // SHARE_VM_GC_IMPLEMENTATION_SHARED_CSPACECOUNTERS_HPP
  