@@ -11,40 +11,33 @@ import (
1111
1212type Refcount struct {
1313 count atomic.Int64
14- Dependencies []* * Refcount
15- Buffers []* * Buffer
16- Derived []unsafe.Pointer
14+ dependencies []* * Refcount
15+ buffers []* * Buffer
16+ derived []unsafe.Pointer
1717}
1818
19+ // Must only be called once per object. Defines the dependency tree.
20+ // When this object is completely unreferenced, all dependencies will
21+ // be unreferenced by it and, if this was the only object still
22+ // referencing them, they will be freed as well, recursively.
1923func (r * Refcount ) ReferenceDependency (d ... * * Refcount ) {
20- if r .Dependencies == nil {
21- r .Dependencies = d
22- } else {
23- for _ , d := range d {
24- r .Dependencies = append (r .Dependencies , d )
25- }
26- }
24+ r .dependencies = d
2725}
2826
29- func (r * Refcount ) ReferenceBuffer (b ... * * Buffer ) {
30- if r .Buffers == nil {
31- r .Buffers = b
32- } else {
33- for _ , b := range b {
34- r .Buffers = append (r .Buffers , b )
35- }
36- }
27+ // Must only be called once per object. Defines buffers that are referenced
28+ // by this object. When this object is unreferenced, all such buffers will
29+ // be deallocated immediately.
30+ func (r * Refcount ) ReferenceBuffer (b ... * * Buffer ) {
31+ r .buffers = b
3732}
3833
39-
34+ // Must only be called once per object, with a list of pointers that are
35+ // _derived from_ allocations owned by or referenced by this object.
36+ // When this object is unreferenced, all such pointers will be nilled.
37+ // Note: this needs the _address of_ the pointers to nil, _not_ the pointers
38+ // themselves!
4039func (r * Refcount ) ReferenceDerived (p ... unsafe.Pointer ) {
41- if r .Derived == nil {
42- r .Derived = p
43- } else {
44- for _ , p := range p {
45- r .Derived = append (r .Derived , p )
46- }
47- }
40+ r .derived = p
4841}
4942
5043func (r * Refcount ) Retain () {
@@ -54,17 +47,17 @@ func (r *Refcount) Retain() {
5447func (r * Refcount ) Release () {
5548 new := r .count .Add (- 1 )
5649 if new == 0 {
57- for _ , buffer := range r .Buffers {
50+ for _ , buffer := range r .buffers {
5851 (* buffer ).Release ()
5952 * buffer = nil
6053 }
61- for _ , dependency := range r .Dependencies {
54+ for _ , dependency := range r .dependencies {
6255 (* dependency ).Release ()
6356 * dependency = nil
6457 }
65- r .Buffers = nil
66- r .Dependencies = nil
67- for _ , derived := range r .Derived {
58+ r .buffers = nil
59+ r .dependencies = nil
60+ for _ , derived := range r .derived {
6861 * ((* uintptr )(derived )) = 0
6962 }
7063 } else if new < 0 {
0 commit comments