Skip to content

Commit 9654a4f

Browse files
author
Noam Preil
committed
better API when refcounting is enabled.
1 parent 31d8443 commit 9654a4f

File tree

1 file changed

+24
-31
lines changed

1 file changed

+24
-31
lines changed

arrow/memory/refcount.go

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,40 +11,33 @@ import (
1111

1212
type 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.
1923
func (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!
4039
func (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

5043
func (r *Refcount) Retain() {
@@ -54,17 +47,17 @@ func (r *Refcount) Retain() {
5447
func (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

Comments
 (0)