-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconcurrent_arena.go
74 lines (65 loc) · 1.71 KB
/
concurrent_arena.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
package memoryArena
import (
"fmt"
"reflect"
"sync"
"unsafe"
)
type ConcurrentArena[T any] struct {
// embedding MemoryArena type in ConcurrentArena
*MemoryArena[T]
mutex sync.RWMutex
}
// Constructor of ConcurrentArena
func NewConcurrentArena[T any](size int) (*ConcurrentArena[T], error) {
arena, err := NewMemoryArena[T](size)
if err != nil {
return nil, err
}
return &ConcurrentArena[T]{
MemoryArena: arena,
mutex: sync.RWMutex{},
}, nil
}
// Allocating object in conccurrent arena
func (arena *ConcurrentArena[T]) Allocate(size int) (unsafe.Pointer, error) {
ptr, err := arena.MemoryArena.Allocate(size)
if err != nil {
return nil, err
}
return ptr, nil
}
// Resetting concurrent arena
func (arena *ConcurrentArena[T]) Reset() {
arena.mutex.Lock()
defer arena.mutex.Unlock()
arena.MemoryArena.Reset()
}
// Object is being allocated in the Concurrent Arena.
func (arena *ConcurrentArena[T]) AllocateObject(obj interface{}) (unsafe.Pointer, error) {
arena.mutex.Lock()
defer arena.mutex.Unlock()
// Get the size of the object
size := reflect.TypeOf(obj).Size()
// Allocate memory
ptr, err := arena.Allocate(int(size))
if err != nil {
return nil, fmt.Errorf("allocation failed due to insufficient memory")
}
// Create a new value at the allocated memory and copy the object into it
ptr, err = SetNewValue(&ptr, obj)
if err != nil {
return nil, err
}
return ptr, nil
}
func (arena *ConcurrentArena[T]) ResizePreserve(newSize int) error {
arena.mutex.Lock()
defer arena.mutex.Unlock()
return arena.MemoryArena.ResizePreserve(newSize)
}
func (arena *ConcurrentArena[T]) Resize(newSize int) error {
arena.mutex.Lock()
defer arena.mutex.Unlock()
return arena.MemoryArena.Resize(newSize)
}