19d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes/*
29d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * Copyright (C) 2008 The Android Open Source Project
39d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes *
49d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
59d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * you may not use this file except in compliance with the License.
69d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * You may obtain a copy of the License at
79d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes *
89d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
99d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes *
109d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * Unless required by applicable law or agreed to in writing, software
119d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
129d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * See the License for the specific language governing permissions and
149d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * limitations under the License.
159d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes */
169d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_RUNTIME_STATS_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_RUNTIME_STATS_H_
199d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
209d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes#include <stdint.h>
219d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
229d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughesnamespace art {
239d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
249d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes// These must match the values in dalvik.system.VMDebug.
259d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughesenum StatKinds {
269d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_ALLOCATED_OBJECTS      = 1<<0,
279d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_ALLOCATED_BYTES        = 1<<1,
289d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_FREED_OBJECTS          = 1<<2,
299d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_FREED_BYTES            = 1<<3,
309d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_GC_INVOCATIONS         = 1<<4,
319d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_CLASS_INIT_COUNT       = 1<<5,
329d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_CLASS_INIT_TIME        = 1<<6,
339d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
349d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  // These values exist for backward compatibility.
359d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_EXT_ALLOCATED_OBJECTS = 1<<12,
369d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_EXT_ALLOCATED_BYTES   = 1<<13,
379d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_EXT_FREED_OBJECTS     = 1<<14,
389d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_EXT_FREED_BYTES       = 1<<15,
399d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
409d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_GLOBAL_ALLOCATED_OBJECTS   = KIND_ALLOCATED_OBJECTS,
419d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_GLOBAL_ALLOCATED_BYTES     = KIND_ALLOCATED_BYTES,
429d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_GLOBAL_FREED_OBJECTS       = KIND_FREED_OBJECTS,
439d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_GLOBAL_FREED_BYTES         = KIND_FREED_BYTES,
449d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_GLOBAL_GC_INVOCATIONS      = KIND_GC_INVOCATIONS,
459d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_GLOBAL_CLASS_INIT_COUNT    = KIND_CLASS_INIT_COUNT,
469d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_GLOBAL_CLASS_INIT_TIME     = KIND_CLASS_INIT_TIME,
479d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
489d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_THREAD_ALLOCATED_OBJECTS   = KIND_ALLOCATED_OBJECTS << 16,
499d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_THREAD_ALLOCATED_BYTES     = KIND_ALLOCATED_BYTES << 16,
509d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_THREAD_FREED_OBJECTS       = KIND_FREED_OBJECTS << 16,
519d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_THREAD_FREED_BYTES         = KIND_FREED_BYTES << 16,
529d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
539d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  KIND_THREAD_GC_INVOCATIONS      = KIND_GC_INVOCATIONS << 16,
549d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
559d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  // TODO: failedAllocCount, failedAllocSize
569d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes};
579d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
589d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes/*
599d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * Memory allocation profiler state.  This is used both globally and
609d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes * per-thread.
619d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes */
62df1ce91ba97bc79a0637e5504b39318fb1c9f577Ian Rogersstruct PACKED(4) RuntimeStats {
639d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  RuntimeStats() {
649d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    Clear(~0);
659d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  }
669d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
679d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  void Clear(int flags) {
689d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    if ((flags & KIND_ALLOCATED_OBJECTS) != 0) {
699d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes      allocated_objects = 0;
709d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    }
719d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    if ((flags & KIND_ALLOCATED_BYTES) != 0) {
729d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes      allocated_bytes = 0;
739d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    }
749d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    if ((flags & KIND_FREED_OBJECTS) != 0) {
759d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes      freed_objects = 0;
769d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    }
779d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    if ((flags & KIND_FREED_BYTES) != 0) {
789d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes      freed_bytes = 0;
799d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    }
809d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    if ((flags & KIND_GC_INVOCATIONS) != 0) {
819d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes      gc_for_alloc_count = 0;
829d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    }
839d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    if ((flags & KIND_CLASS_INIT_COUNT) != 0) {
849d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes      class_init_count = 0;
859d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    }
869d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    if ((flags & KIND_CLASS_INIT_TIME) != 0) {
879d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes      class_init_time_ns = 0;
889d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes    }
899d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  }
909d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
919d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  // Number of objects allocated.
92dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  uint64_t allocated_objects;
939d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  // Cumulative size of all objects allocated.
94dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  uint64_t allocated_bytes;
959d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
969d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  // Number of objects freed.
97dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  uint64_t freed_objects;
989d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  // Cumulative size of all freed objects.
99dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  uint64_t freed_bytes;
1009d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
1019d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  // Number of times an allocation triggered a GC.
102dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  uint64_t gc_for_alloc_count;
1039d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
1049d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  // Number of initialized classes.
105dd7624d2b9e599d57762d12031b10b89defc9807Ian Rogers  uint64_t class_init_count;
1069d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  // Cumulative time spent in class initialization.
1079d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  uint64_t class_init_time_ns;
1089d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
1099d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes  DISALLOW_COPY_AND_ASSIGN(RuntimeStats);
1109d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes};
1119d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
1129d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes}  // namespace art
1139d5ccec86d60c9ddd811836b9a2bc28d0b3d11feElliott Hughes
114fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_RUNTIME_STATS_H_
115