Skip to content

Commit 4b7be6a

Browse files
cosmo0920edsiper
authored andcommitted
Allocate memory via C.malloc
Signed-off-by: Hiroshi Hatake <[email protected]>
1 parent 1ecd604 commit 4b7be6a

File tree

1 file changed

+36
-11
lines changed

1 file changed

+36
-11
lines changed

examples/in_gdummy/in_gdummy.go

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,29 @@
11
package main
22

3+
/*
4+
#include <stdlib.h>
5+
*/
36
import "C"
47
import (
58
"fmt"
69
"time"
710
"reflect"
11+
"runtime"
812
"unsafe"
913

1014
"github.com/fluent/fluent-bit-go/input"
1115
)
1216

17+
type Slice struct {
18+
Data []byte
19+
data *c_slice_t
20+
}
21+
22+
type c_slice_t struct {
23+
p unsafe.Pointer
24+
n int
25+
}
26+
1327
//export FLBPluginRegister
1428
func FLBPluginRegister(def unsafe.Pointer) int {
1529
return input.FLBPluginRegister(def, "gdummy", "dummy GO!")
@@ -25,19 +39,28 @@ func FLBPluginInit(plugin unsafe.Pointer) int {
2539
return input.FLB_OK
2640
}
2741

28-
func MakePayload(packed []byte) (**C.void, int) {
29-
var payload **C.void
42+
func alloc(size int) unsafe.Pointer {
43+
return C.calloc(C.size_t(size), 1)
44+
}
45+
46+
func makeSlice(p unsafe.Pointer, n int) *Slice {
47+
data := &c_slice_t{p, n}
3048

31-
length := len(packed)
32-
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&payload))
33-
hdr.Data = uintptr(unsafe.Pointer(&packed))
34-
hdr.Len = length
49+
runtime.SetFinalizer(data, func(data *c_slice_t){
50+
C.free(data.p)
51+
})
52+
53+
s := &Slice{data: data}
54+
h := (*reflect.SliceHeader)(unsafe.Pointer(&s.Data))
55+
h.Data = uintptr(p)
56+
h.Len = n
57+
h.Cap = n
3558

36-
return payload, length
59+
return s
3760
}
3861

3962
//export FLBPluginInputCallback
40-
func FLBPluginInputCallback(data **C.void, size *C.size_t) int {
63+
func FLBPluginInputCallback(data *unsafe.Pointer, size *C.size_t) int {
4164
now := time.Now()
4265
flb_time := input.FLBTime{now}
4366
message := map[string]string{"message": "dummy"}
@@ -51,9 +74,11 @@ func FLBPluginInputCallback(data **C.void, size *C.size_t) int {
5174
return input.FLB_ERROR
5275
}
5376

54-
payload, length := MakePayload(packed)
55-
56-
*data = *payload
77+
length := len(packed)
78+
p := alloc(length)
79+
s := makeSlice(p, length)
80+
copy(s.Data, packed)
81+
*data = unsafe.Pointer(&s.Data[0])
5782
*size = C.size_t(length)
5883
// For emitting interval adjustment.
5984
time.Sleep(1000 * time.Millisecond)

0 commit comments

Comments
 (0)