-
Notifications
You must be signed in to change notification settings - Fork 1
/
meta.go
82 lines (70 loc) · 2.17 KB
/
meta.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package storage
import (
"encoding/gob"
"fmt"
"io"
"github.com/danielleontiev/neojhat/core"
)
func init() {
gob.Register(core.Identifier(0))
gob.Register(core.JavaType(0))
}
type MetaWriteStorage struct {
MetaStorage
}
func NewMetaWriteStorage() *MetaWriteStorage {
underlyingMetaStorage := MetaStorage{
Counters: Counters{
InstancesCount: make(map[core.Identifier]int),
PrimArraysCount: make(map[core.JavaType]int),
PrimArrayElementsCount: make(map[core.JavaType]int),
ObjArraysCount: make(map[core.Identifier]int),
ObjArrayElementsCount: make(map[core.Identifier]int),
},
}
return &MetaWriteStorage{underlyingMetaStorage}
}
func (s *MetaWriteStorage) SerializeTo(destination io.Writer) error {
encoder := gob.NewEncoder(destination)
if err := encoder.Encode(s.MetaStorage); err != nil {
return fmt.Errorf("cannot serialize: %w", err)
}
return nil
}
func (s *MetaWriteStorage) AddInstance(obj any) {
switch o := obj.(type) {
case core.HprofGcClassDumpInstanceDumpHeader:
s.MetaStorage.Counters.InstancesCount[o.ClassObjectId]++
case core.HprofGcObjArrayDumpHeader:
s.MetaStorage.Counters.ObjArraysCount[o.ArrayClassId]++
s.MetaStorage.Counters.ObjArrayElementsCount[o.ArrayClassId] += int(o.NumberOfElements)
case core.HprofGcPrimArrayDumpHeader:
s.MetaStorage.Counters.PrimArraysCount[o.ElementType]++
s.MetaStorage.Counters.PrimArrayElementsCount[o.ElementType] += int(o.NumberOfElements)
}
}
type MetaReadStorage struct {
MetaStorage
}
func NewMetaReadStorage() *MetaReadStorage {
return new(MetaReadStorage)
}
func (s *MetaReadStorage) RestoreFrom(source io.Reader) error {
var underlyingMetaStorage MetaStorage
decoder := gob.NewDecoder(source)
if err := decoder.Decode(&underlyingMetaStorage); err != nil {
return fmt.Errorf("cannot deserialize: %w", err)
}
s.MetaStorage = underlyingMetaStorage
return nil
}
type MetaStorage struct {
Counters Counters
}
type Counters struct {
InstancesCount map[core.Identifier]int
PrimArraysCount map[core.JavaType]int
PrimArrayElementsCount map[core.JavaType]int
ObjArraysCount map[core.Identifier]int
ObjArrayElementsCount map[core.Identifier]int
}