forked from vova616/GarageEngine
/
Resources.go
82 lines (67 loc) · 1.37 KB
/
Resources.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 engine
import (
"fmt"
//"github.com/go-gl/gl"
)
type ResID interface{}
type Resource interface {
Release()
}
var (
ResourceManager = &Resources{make(map[ResID]Resource)}
)
type MemHandle struct {
Buff []byte
}
func Allocate(size int) *MemHandle {
return &MemHandle{make([]byte, size)}
}
func (m *MemHandle) Release() {
m.Buff = nil
}
func (m *MemHandle) Bytes() []byte {
return m.Buff
}
type Resources struct {
Resources map[ResID]Resource
}
func (r *Resources) Add(res Resource) error {
_, exists := r.Resources[res]
if exists {
return fmt.Errorf("Cannot add res %d %v", res, res)
} else {
r.Resources[res] = res
}
return nil
}
func (r *Resources) AddManual(res Resource, key interface{}) error {
_, exists := r.Resources[key]
if exists {
return fmt.Errorf("Cannot add res %d %v", res, res)
} else {
r.Resources[res] = res
}
return nil
}
func (r *Resources) Release() {
for _, res := range r.Resources {
releaseSafe(res)
}
r.Resources = make(map[ResID]Resource)
}
func (r *Resources) ReleaseResource(res interface{}) {
resData, exists := r.Resources[res]
if exists {
resData.Release()
delete(r.Resources, res)
}
}
func releaseSafe(res Resource) {
defer recoverFromPanic(res)
res.Release()
}
func recoverFromPanic(res Resource) {
if err := recover(); err != nil {
fmt.Printf("release failed: ID:%d Res:%v Error:%v\n", res, res, err)
}
}