Break core structs down into obj and leak packages

This commit is contained in:
2018-07-08 02:56:51 +01:00
parent 2fdb51166c
commit 6883984950
5 changed files with 21 additions and 16 deletions

104
obj/dump.go Normal file
View File

@@ -0,0 +1,104 @@
package obj
import (
"bufio"
"fmt"
"io"
"os"
"sort"
)
func NewDump(file string) *Dump {
return &Dump{File: file}
}
// Dump contains all relevant data for a single heap dump.
type Dump struct {
File string
Index []*string
Entries map[string]*Entry
}
// Process processes the heap dump
func (s *Dump) Process() error {
file, err := os.Open(s.File)
defer file.Close()
if err != nil {
return err
}
s.Entries = map[string]*Entry{}
var offset int64 = -1
reader := bufio.NewReader(file)
for {
offset++
line, err := reader.ReadBytes(byte('\n'))
if err == io.EOF {
break
} else if err != nil {
return err
}
entry, err := NewEntry(line)
if err != nil {
return err
}
entry.Offset = offset
s.Entries[entry.Index] = entry
s.Index = append(s.Index, &entry.Index)
}
return nil
}
func (s *Dump) PrintEntryAddress(indexes []*string) {
for _, index := range indexes {
if entry, ok := s.Entries[*index]; ok {
fmt.Println(entry.Address())
}
}
}
func (s *Dump) PrintEntryJSON(indexes []*string) error {
file, err := os.Open(s.File)
defer file.Close()
if err != nil {
return err
}
offsets := s.sortedOffsets(indexes)
var current int64
var offset int64 = -1
reader := bufio.NewReader(file)
for {
offset++
line, err := reader.ReadBytes(byte('\n'))
if err == io.EOF {
break
} else if err != nil {
return err
}
if offset == offsets[current] {
current++
fmt.Print(string(line))
}
}
return nil
}
func (s *Dump) sortedOffsets(indexes []*string) []int64 {
var res []int64
for _, index := range indexes {
res = append(res, s.Entries[*index].Offset)
}
sort.Slice(res, func(i, j int) bool { return res[i] < res[j] })
return res
}

24
obj/entry.go Normal file
View File

@@ -0,0 +1,24 @@
package obj
func NewEntry(inputJSON []byte) (*Entry, error) {
obj, err := NewObject(inputJSON)
if err != nil {
return nil, err
}
return &Entry{
Object: obj,
Index: obj.Index(),
}, err
}
// Entry is a parsed heap item object
type Entry struct {
Object *Object
Offset int64
Index string
}
func (s *Entry) Address() string {
return s.Object.Address
}

21
obj/object.go Normal file
View File

@@ -0,0 +1,21 @@
package obj
import "encoding/json"
//go:generate easyjson -all object.go
func NewObject(inputJSON []byte) (*Object, error) {
var obj Object
err := json.Unmarshal(inputJSON, &obj)
return &obj, err
}
type Object struct {
Address string `json:"address"`
Type string `json:"type"`
}
func (s *Object) Index() string {
return s.Address + ":" + s.Type
}

103
obj/object_easyjson.go Normal file
View File

@@ -0,0 +1,103 @@
// Code generated by easyjson for marshaling/unmarshaling. DO NOT EDIT.
package obj
import (
json "encoding/json"
easyjson "github.com/mailru/easyjson"
jlexer "github.com/mailru/easyjson/jlexer"
jwriter "github.com/mailru/easyjson/jwriter"
)
// suppress unused package warning
var (
_ *json.RawMessage
_ *jlexer.Lexer
_ *jwriter.Writer
_ easyjson.Marshaler
)
func easyjsonE44bcf2dDecodeGithubComJimehRbheapleak(in *jlexer.Lexer, out *Object) {
isTopLevel := in.IsStart()
if in.IsNull() {
if isTopLevel {
in.Consumed()
}
in.Skip()
return
}
in.Delim('{')
for !in.IsDelim('}') {
key := in.UnsafeString()
in.WantColon()
if in.IsNull() {
in.Skip()
in.WantComma()
continue
}
switch key {
case "address":
out.Address = string(in.String())
case "type":
out.Type = string(in.String())
default:
in.SkipRecursive()
}
in.WantComma()
}
in.Delim('}')
if isTopLevel {
in.Consumed()
}
}
func easyjsonE44bcf2dEncodeGithubComJimehRbheapleak(out *jwriter.Writer, in Object) {
out.RawByte('{')
first := true
_ = first
{
const prefix string = ",\"address\":"
if first {
first = false
out.RawString(prefix[1:])
} else {
out.RawString(prefix)
}
out.String(string(in.Address))
}
{
const prefix string = ",\"type\":"
if first {
first = false
out.RawString(prefix[1:])
} else {
out.RawString(prefix)
}
out.String(string(in.Type))
}
out.RawByte('}')
}
// MarshalJSON supports json.Marshaler interface
func (v Object) MarshalJSON() ([]byte, error) {
w := jwriter.Writer{}
easyjsonE44bcf2dEncodeGithubComJimehRbheapleak(&w, v)
return w.Buffer.BuildBytes(), w.Error
}
// MarshalEasyJSON supports easyjson.Marshaler interface
func (v Object) MarshalEasyJSON(w *jwriter.Writer) {
easyjsonE44bcf2dEncodeGithubComJimehRbheapleak(w, v)
}
// UnmarshalJSON supports json.Unmarshaler interface
func (v *Object) UnmarshalJSON(data []byte) error {
r := jlexer.Lexer{Data: data}
easyjsonE44bcf2dDecodeGithubComJimehRbheapleak(&r, v)
return r.Error()
}
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
func (v *Object) UnmarshalEasyJSON(l *jlexer.Lexer) {
easyjsonE44bcf2dDecodeGithubComJimehRbheapleak(l, v)
}