commit 14e763c65a199689920030cc77b09ea16b6079ce Author: Victor Timofei Date: Fri Jul 29 21:45:20 2022 +0300 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..710e463 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +cgo-callback +mylib.o diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..90d8c2c --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +GO=go + +.PHONY: all +all: cgo-callback + +mylib.o: mylib.c + +cgo-callback: mylib.o mylib.h + $(GO) build + +.PHONY: clean +clean: + rm -f mylib.o cgo-callback diff --git a/cfuncs.go b/cfuncs.go new file mode 100644 index 0000000..da794e7 --- /dev/null +++ b/cfuncs.go @@ -0,0 +1,13 @@ +package main + +/* +#include + +void callOnMeGo_cgo(int n) +{ + printf("callOnMeGo_cgo called\n"); + void callOnMeGo(int); + callOnMeGo(n); +} +*/ +import "C" diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f97c023 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.vtimothy.com/vtimofei/cgo-callback + +go 1.18 diff --git a/main.go b/main.go new file mode 100644 index 0000000..0c4eea4 --- /dev/null +++ b/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "fmt" + "sync" + "unsafe" +) + +/* +#cgo CFLAGS: -I . +#cgo LDFLAGS: -L . + +#include "mylib.h" + +void callOnMeGo_cgo(int n); +*/ +import "C" + +//export callOnMeGo +func callOnMeGo(n int) { + printerCallback(n) +} + +type Printer func(int) + +var printerCallback Printer +var printerCallbackLock sync.RWMutex + +func usePrinter(p Printer) { + printerCallbackLock.Lock() + printerCallback = p + C.use_printer((C.printer_t)(unsafe.Pointer(C.callOnMeGo_cgo))) + printerCallback = nil + printerCallbackLock.Unlock() +} + +var myPrinter Printer = Printer(func(n int) { + for i := 0; i < n; i++ { + fmt.Printf("%d\n", i) + } +}) + +func main() { + usePrinter(myPrinter) +} diff --git a/mylib.c b/mylib.c new file mode 100644 index 0000000..e00bb2e --- /dev/null +++ b/mylib.c @@ -0,0 +1,6 @@ +#include "mylib.h" + +void use_printer(printer_t p) +{ + p(14); +} diff --git a/mylib.h b/mylib.h new file mode 100644 index 0000000..d767883 --- /dev/null +++ b/mylib.h @@ -0,0 +1,8 @@ +#ifndef MYLIB_H +#define MYLIB_H 1 + +typedef void (*printer_t)(int); + +void use_printer(printer_t); + +#endif