11package main
22
3+ /*
4+ #include <stdlib.h>
5+ */
36import "C"
47import (
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
1428func 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