aoqi@0: /* aoqi@0: * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: * aoqi@0: */ aoqi@0: aoqi@0: #ifndef SHARE_VM_UTILITIES_HISTOGRAM_HPP aoqi@0: #define SHARE_VM_UTILITIES_HISTOGRAM_HPP aoqi@0: aoqi@0: #include "memory/allocation.hpp" aoqi@0: #include "runtime/os.hpp" aoqi@0: #include "utilities/growableArray.hpp" aoqi@0: #ifdef TARGET_OS_FAMILY_linux aoqi@0: # include "os_linux.inline.hpp" aoqi@0: #endif aoqi@0: #ifdef TARGET_OS_FAMILY_solaris aoqi@0: # include "os_solaris.inline.hpp" aoqi@0: #endif aoqi@0: #ifdef TARGET_OS_FAMILY_windows aoqi@0: # include "os_windows.inline.hpp" aoqi@0: #endif aoqi@0: #ifdef TARGET_OS_FAMILY_aix aoqi@0: # include "os_aix.inline.hpp" aoqi@0: #endif aoqi@0: #ifdef TARGET_OS_FAMILY_bsd aoqi@0: # include "os_bsd.inline.hpp" aoqi@0: #endif aoqi@0: aoqi@0: // This class provides a framework for collecting various statistics. aoqi@0: // The current implementation is oriented towards counting invocations aoqi@0: // of various types, but that can be easily changed. aoqi@0: // aoqi@0: // To use it, you need to declare a Histogram*, and a subtype of aoqi@0: // HistogramElement: aoqi@0: // aoqi@0: // HistogramElement* MyHistogram; aoqi@0: // aoqi@0: // class MyHistogramElement : public HistogramElement { aoqi@0: // public: aoqi@0: // MyHistogramElement(char* name); aoqi@0: // }; aoqi@0: // aoqi@0: // MyHistogramElement::MyHistogramElement(char* elementName) { aoqi@0: // _name = elementName; aoqi@0: // aoqi@0: // if(MyHistogram == NULL) aoqi@0: // MyHistogram = new Histogram("My Call Counts",100); aoqi@0: // aoqi@0: // MyHistogram->add_element(this); aoqi@0: // } aoqi@0: // aoqi@0: // #define MyCountWrapper(arg) static MyHistogramElement* e = new MyHistogramElement(arg); e->increment_count() aoqi@0: // aoqi@0: // This gives you a simple way to count invocations of specfic functions: aoqi@0: // aoqi@0: // void a_function_that_is_being_counted() { aoqi@0: // MyCountWrapper("FunctionName"); aoqi@0: // ... aoqi@0: // } aoqi@0: // aoqi@0: // To print the results, invoke print() on your Histogram*. aoqi@0: aoqi@0: #ifdef ASSERT aoqi@0: aoqi@0: class HistogramElement : public CHeapObj { aoqi@0: protected: aoqi@0: jint _count; aoqi@0: const char* _name; aoqi@0: aoqi@0: public: aoqi@0: HistogramElement(); aoqi@0: virtual int count(); aoqi@0: virtual const char* name(); aoqi@0: virtual void increment_count(); aoqi@0: void print_on(outputStream* st) const; aoqi@0: virtual int compare(HistogramElement* e1,HistogramElement* e2); aoqi@0: }; aoqi@0: aoqi@0: class Histogram : public CHeapObj { aoqi@0: protected: aoqi@0: GrowableArray* _elements; aoqi@0: GrowableArray* elements() { return _elements; } aoqi@0: const char* _title; aoqi@0: const char* title() { return _title; } aoqi@0: static int sort_helper(HistogramElement** e1,HistogramElement** e2); aoqi@0: virtual void print_header(outputStream* st); aoqi@0: virtual void print_elements(outputStream* st); aoqi@0: aoqi@0: public: aoqi@0: Histogram(const char* title,int estimatedSize); aoqi@0: virtual void add_element(HistogramElement* element); aoqi@0: void print_on(outputStream* st) const; aoqi@0: }; aoqi@0: aoqi@0: #endif aoqi@0: aoqi@0: #endif // SHARE_VM_UTILITIES_HISTOGRAM_HPP