@@ -6,9 +6,16 @@ package vaccel
66#cgo pkg-config: vaccel
77#cgo LDFLAGS: -lvaccel -ldl
88#include <vaccel.h>
9+ #include <stdatomic.h>
10+ #include <stdint.h>
11+
12+ static uint32_t get_refcount(atomic_uint *ref) {
13+ return atomic_load((_Atomic unsigned int *)ref);
14+ }
915
1016*/
1117import "C"
18+ import "unsafe"
1219
1320type ResourceType int
1421
@@ -19,21 +26,79 @@ const (
1926)
2027
2128type Resource struct {
22- cRes C.struct_vaccel_resource
29+ cRes * C.struct_vaccel_resource
2330}
2431
2532func (t ResourceType ) ToCEnum () C.vaccel_resource_type_t {
2633 return C .vaccel_resource_type_t (t )
2734}
2835
2936func (r * Resource ) Init (path string , resType ResourceType ) int {
30- return int (C .vaccel_resource_init (& r .cRes , C .CString (path ), resType .ToCEnum ())) //nolint:gocritic
37+ return int (C .vaccel_resource_new (& r .cRes , C .CString (path ), resType .ToCEnum ())) //nolint:gocritic
38+ }
39+
40+ func (r * Resource ) InitMulti (paths []string , resType ResourceType ) int {
41+ nrPaths := len (paths )
42+ cNrPaths := C .size_t (nrPaths )
43+
44+ spaceSize := cNrPaths * C .size_t (unsafe .Sizeof (uintptr (0 )))
45+ cSpace := C .malloc (spaceSize )
46+ defer C .free (cSpace )
47+
48+ cPathsPtr := (* * C .char )(cSpace )
49+ pathSlice := unsafe .Slice ((* * C .char )(cPathsPtr ), nrPaths )
50+
51+ for i := 0 ; i < nrPaths ; i ++ {
52+ str := C .CString (paths [i ])
53+ defer C .free (unsafe .Pointer (str ))
54+
55+ pathSlice [i ] = str
56+ }
57+ return int (C .vaccel_resource_multi_new (& r .cRes , cPathsPtr , cNrPaths , resType .ToCEnum ())) //nolint:gocritic
58+ }
59+
60+ func (r * Resource ) InitFromBuf (bytes []byte , resType ResourceType , filename string , memOnly bool ) int {
61+ cResBytes := (* C .uchar )(& bytes [0 ])
62+ cResBuf := unsafe .Pointer (cResBytes )
63+ cResLen := C .size_t (len (bytes ))
64+
65+ var cfname * C.char
66+ if filename == "" {
67+ cfname = nil
68+ } else {
69+ cfname = C .CString (filename )
70+ defer C .free (unsafe .Pointer (cfname ))
71+ }
72+
73+ return int (C .vaccel_resource_from_buf (& r .cRes , cResBuf , cResLen , resType .ToCEnum (), cfname , C .bool (memOnly ))) //nolint:gocritic
74+ }
75+
76+ func (r * Resource ) InitFromBlobs (blobs []Blob , resType ResourceType ) int {
77+ nrBlobs := len (blobs )
78+ cNrBlobs := C .size_t (nrBlobs )
79+
80+ bufSize := cNrBlobs * C .size_t (unsafe .Sizeof (uintptr (0 )))
81+ cSpace := C .malloc (bufSize )
82+ defer C .free (cSpace )
83+
84+ cBlobsPtr := (* * C .struct_vaccel_blob )(cSpace )
85+ blobSlice := unsafe .Slice ((* * C .struct_vaccel_blob )(cBlobsPtr ), nrBlobs )
86+
87+ for i := 0 ; i < nrBlobs ; i ++ {
88+ blobSlice [i ] = blobs [i ].cBlob
89+ }
90+
91+ return int (C .vaccel_resource_from_blobs (& r .cRes , cBlobsPtr , cNrBlobs , resType .ToCEnum ())) //nolint:gocritic
3192}
3293
3394func (r * Resource ) Release () int {
34- return int (C .vaccel_resource_release ( & r .cRes )) //nolint:gocritic
95+ return int (C .vaccel_resource_delete ( r .cRes )) //nolint:gocritic
3596}
3697
3798func (r * Resource ) GetID () int64 {
3899 return int64 (r .cRes .id )
39100}
101+
102+ func (r * Resource ) GetRefcount () uint32 {
103+ return uint32 (C .get_refcount (& r .cRes .refcount ))
104+ }
0 commit comments