Clean up the hprof implementation a bit.
Change-Id: I9e6622cd5ec10fe8af6553f72095bf3dee00afdd
diff --git a/src/hprof/hprof.h b/src/hprof/hprof.h
index e2f7ce1..c6222dc 100644
--- a/src/hprof/hprof.h
+++ b/src/hprof/hprof.h
@@ -13,219 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
#ifndef HPROF_HPROF_H_
#define HPROF_HPROF_H_
-#include <stdio.h>
-
-#include <set>
-
-#include "file.h"
-#include "globals.h"
-#include "object.h"
-#include "safe_map.h"
-#include "thread_list.h"
-
namespace art {
namespace hprof {
-#define HPROF_ID_SIZE (sizeof (uint32_t))
-
-#define UNIQUE_ERROR() \
- -((((uintptr_t)__func__) << 16 | __LINE__) & (0x7fffffff))
-
-#define HPROF_TIME 0
-#define HPROF_NULL_STACK_TRACE 0
-#define HPROF_NULL_THREAD 0
-
-#define U2_TO_BUF_BE(buf, offset, value) \
- do { \
- unsigned char* buf_ = (unsigned char*)(buf); \
- int offset_ = (int)(offset); \
- uint16_t value_ = (uint16_t)(value); \
- buf_[offset_ + 0] = (unsigned char)(value_ >> 8); \
- buf_[offset_ + 1] = (unsigned char)(value_ ); \
- } while (0)
-
-#define U4_TO_BUF_BE(buf, offset, value) \
- do { \
- unsigned char* buf_ = (unsigned char*)(buf); \
- int offset_ = (int)(offset); \
- uint32_t value_ = (uint32_t)(value); \
- buf_[offset_ + 0] = (unsigned char)(value_ >> 24); \
- buf_[offset_ + 1] = (unsigned char)(value_ >> 16); \
- buf_[offset_ + 2] = (unsigned char)(value_ >> 8); \
- buf_[offset_ + 3] = (unsigned char)(value_ ); \
- } while (0)
-
-#define U8_TO_BUF_BE(buf, offset, value) \
- do { \
- unsigned char* buf_ = (unsigned char*)(buf); \
- int offset_ = (int)(offset); \
- uint64_t value_ = (uint64_t)(value); \
- buf_[offset_ + 0] = (unsigned char)(value_ >> 56); \
- buf_[offset_ + 1] = (unsigned char)(value_ >> 48); \
- buf_[offset_ + 2] = (unsigned char)(value_ >> 40); \
- buf_[offset_ + 3] = (unsigned char)(value_ >> 32); \
- buf_[offset_ + 4] = (unsigned char)(value_ >> 24); \
- buf_[offset_ + 5] = (unsigned char)(value_ >> 16); \
- buf_[offset_ + 6] = (unsigned char)(value_ >> 8); \
- buf_[offset_ + 7] = (unsigned char)(value_ ); \
- } while (0)
-
-typedef uint32_t HprofId;
-typedef HprofId HprofStringId;
-typedef HprofId HprofObjectId;
-typedef HprofId HprofClassObjectId;
-typedef std::set<Class*> ClassSet;
-typedef std::set<Class*>::iterator ClassSetIterator;
-typedef SafeMap<std::string, size_t> StringMap;
-typedef SafeMap<std::string, size_t>::iterator StringMapIterator;
-
-enum HprofBasicType {
- hprof_basic_object = 2,
- hprof_basic_boolean = 4,
- hprof_basic_char = 5,
- hprof_basic_float = 6,
- hprof_basic_double = 7,
- hprof_basic_byte = 8,
- hprof_basic_short = 9,
- hprof_basic_int = 10,
- hprof_basic_long = 11,
-};
-
-enum HprofTag {
- HPROF_TAG_STRING = 0x01,
- HPROF_TAG_LOAD_CLASS = 0x02,
- HPROF_TAG_UNLOAD_CLASS = 0x03,
- HPROF_TAG_STACK_FRAME = 0x04,
- HPROF_TAG_STACK_TRACE = 0x05,
- HPROF_TAG_ALLOC_SITES = 0x06,
- HPROF_TAG_HEAP_SUMMARY = 0x07,
- HPROF_TAG_START_THREAD = 0x0A,
- HPROF_TAG_END_THREAD = 0x0B,
- HPROF_TAG_HEAP_DUMP = 0x0C,
- HPROF_TAG_HEAP_DUMP_SEGMENT = 0x1C,
- HPROF_TAG_HEAP_DUMP_END = 0x2C,
- HPROF_TAG_CPU_SAMPLES = 0x0D,
- HPROF_TAG_CONTROL_SETTINGS = 0x0E,
-};
-
-// Values for the first byte of HEAP_DUMP and HEAP_DUMP_SEGMENT records:
-enum HprofHeapTag {
- /* standard */
- HPROF_ROOT_UNKNOWN = 0xFF,
- HPROF_ROOT_JNI_GLOBAL = 0x01,
- HPROF_ROOT_JNI_LOCAL = 0x02,
- HPROF_ROOT_JAVA_FRAME = 0x03,
- HPROF_ROOT_NATIVE_STACK = 0x04,
- HPROF_ROOT_STICKY_CLASS = 0x05,
- HPROF_ROOT_THREAD_BLOCK = 0x06,
- HPROF_ROOT_MONITOR_USED = 0x07,
- HPROF_ROOT_THREAD_OBJECT = 0x08,
- HPROF_CLASS_DUMP = 0x20,
- HPROF_INSTANCE_DUMP = 0x21,
- HPROF_OBJECT_ARRAY_DUMP = 0x22,
- HPROF_PRIMITIVE_ARRAY_DUMP = 0x23,
-
- /* Android */
- HPROF_HEAP_DUMP_INFO = 0xfe,
- HPROF_ROOT_INTERNED_STRING = 0x89,
- HPROF_ROOT_FINALIZING = 0x8a, /* obsolete */
- HPROF_ROOT_DEBUGGER = 0x8b,
- HPROF_ROOT_REFERENCE_CLEANUP = 0x8c, /* obsolete */
- HPROF_ROOT_VM_INTERNAL = 0x8d,
- HPROF_ROOT_JNI_MONITOR = 0x8e,
- HPROF_UNREACHABLE = 0x90, /* obsolete */
- HPROF_PRIMITIVE_ARRAY_NODATA_DUMP = 0xc3,
-};
-
-// Represents a top-level hprof record, whose serialized format is:
-// U1 TAG: denoting the type of the record
-// U4 TIME: number of microseconds since the time stamp in the header
-// U4 LENGTH: number of bytes that follow this uint32_t field and belong to this record
-// U1* BODY: as many bytes as specified in the above uint32_t field
-class HprofRecord {
- public:
- int Flush(FILE *fp);
- int AddU1(uint8_t value);
- int AddU2(uint16_t value);
- int AddU4(uint32_t value);
- int AddU8(uint64_t value);
- int AddId(HprofObjectId value);
- int AddU1List(const uint8_t *values, size_t numValues);
- int AddU2List(const uint16_t *values, size_t numValues);
- int AddU4List(const uint32_t *values, size_t numValues);
- int AddU8List(const uint64_t *values, size_t numValues);
- int AddIdList(const HprofObjectId *values, size_t numValues);
- int AddUtf8String(const char* str);
-
- unsigned char* body_;
- uint32_t time_;
- uint32_t length_;
- size_t alloc_length_;
- uint8_t tag_;
- bool dirty_;
-
- private:
- int GuaranteeRecordAppend(size_t nmore);
-};
-
-enum HprofHeapId {
- HPROF_HEAP_DEFAULT = 0,
- HPROF_HEAP_ZYGOTE = 'Z',
- HPROF_HEAP_APP = 'A'
-};
-
-class Hprof {
- public:
- Hprof(const char* outputFileName, int fd, bool writeHeader, bool directToDdms);
- ~Hprof();
-
- void VisitRoot(const Object* obj);
- int DumpHeapObject(const Object *obj);
- bool Finish();
-
- private:
- int DumpClasses();
- int DumpStrings();
- int StartNewRecord(uint8_t tag, uint32_t time);
- int FlushCurrentRecord();
- int MarkRootObject(const Object *obj, jobject jniObj);
- HprofClassObjectId LookupClassId(Class* c);
- HprofStringId LookupStringId(String* string);
- HprofStringId LookupStringId(const char* string);
- HprofStringId LookupStringId(const std::string& string);
- HprofStringId LookupClassNameId(Class* c);
- static HprofBasicType SignatureToBasicTypeAndSize(const char* sig, size_t* sizeOut);
- static HprofBasicType PrimitiveToBasicTypeAndSize(Primitive::Type prim, size_t* sizeOut);
- static int StackTraceSerialNumber(const void *obj);
-
- // current_record_ *must* be first so that we can cast from a context to a record.
- HprofRecord current_record_;
-
- uint32_t gc_thread_serial_number_;
- uint8_t gc_scan_state_;
- HprofHeapId current_heap_; // which heap we're currently emitting
- size_t objects_in_segment_;
-
- // If direct_to_ddms_ is set, "file_name_" and "fd" will be ignored.
- // Otherwise, "file_name_" must be valid, though if "fd" >= 0 it will
- // only be used for debug messages.
- bool direct_to_ddms_;
- std::string file_name_;
- char* file_data_ptr_; // for open_memstream
- size_t file_data_size_; // for open_memstream
- FILE *mem_fp_;
- int fd_;
-
- ClassSet classes_;
- size_t next_string_id_;
- StringMap strings_;
-};
-
-int DumpHeap(const char* fileName, int fd, bool directToDdms);
+void DumpHeap(const char* filename, int fd, bool direct_to_ddms);
} // namespace hprof