goplus / c2go

Convert C to Go

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

how about make char*

aadog opened this issue · comments

commented

how about make char*

I don't understand what you means.
If you want a C constant string, you can use C"xxx" in Go+.

commented

想把它作为go库使用

I think you want convert a Go string to a C style string?
Here is a way to do this:

import "github.com/goplus/libc"
import "reflect"

func CString(s string) *int8 {
    sh := *(*reflect.StringHeader)(unsafe.Pointer(&s))
    n := int32(sh.Len)
    p := (*int8)(libc.Malloc(n+1))
    libc.Memcpy(unsafe.Pointer(p), unsafe.Pointer(sh.Data), n)
    p[n] = '\0'
    return p
}
commented

..额,意思是,libc不内置一下吗,
我做了好几个cgo-less的项目,似乎咱这个玩法有点问题,有时候会被莫名的gc掉

commented

所以玩到最后估计项目问题有点大

..额,意思是,libc不内置一下吗, 我做了好几个cgo-less的项目,似乎咱这个玩法有点问题,有时候会被莫名的gc掉

这个我想过,可能最后需要 Go 的 gc 协作。协作规则也比较简单,我设想 c2go malloc 分配的内存在一个比较确定的虚拟地址空间范围内,这个范围内的 pointer 值都不参与 gc。这样可以用非常简单的方式避免与 gc 冲突,基本上对 go 的 gc 算法改动极少。

commented

嗯,直接维护一个内存池比较理想,把堆仍进go里,不过有时候实现一些memcpy什么得如果不来自malloc得内存问题就很大,这个项目目测八九不离十会出大坑

还有个问题,有时候static 函数必须要cgo,这个玩意不太好处理,一般是syscall.newcallback

commented

我觉得直接调用dll问题会少很多,llvm只重写头文件

commented

我们做cgo-less的交互接口会方便很多
x* => uintptr
struct=>uintptr
int=>int32

commented

然后加几个辅助函数
go.CStringToGo() string
go.GoStringToC()uintptr

多谢,这些都是很重要的经验。

当前 T* 和 void* 都是映射成 Go 的指针,不过我也在考虑改用 uintptr 这个方式。不过这些都只是实现变更,从 Go+ 的角度都不会改变使用方式。例如:

int chdir(char* dir);

这个函数现在被翻译成了:

func Chdir(dir *int8) int32

考虑到避免受 gc 的影响,它会被翻译成:

func Chdir(dir uintptr) int32

但是从 Go+ 的角度来说,还是会按 func Chdir(dir *int8) int32 这个原型来理解和使用这个函数。即:

ret := C.chdir(C"xxx")

Go+ 把这段代码翻译成 Go 的时候,会把 C"xxx" 转成 uintptr 传进去。

这样所有的 c2go 代码就都是不受 gc 影响了。

基于 dll 看似简单,实际上一点也不简单,会遇到其他方面的问题,比如 pthread 和 goroutine 打架的问题,那样用户使用的心智负担还是会比较大的。所以我的想法是 dll 不是不支持,但是一上来要先解决最难的部分。dll 支持只能受限支持,会在解决特定领域问题的时候,由领域专家来完成基于 dll 来包装成 Go+ 模块的工作,但是这个工作并不适合普通程序员来完成。

commented

是的,如果要做这部分工作需要探讨可以联系我
我们做过几个典型这种模式下几个典型例子,你可以参考扫两眼

https://github.com/ying32/govcl
https://github.com/aadog/py3-go
commented

线程打架问题一般直接锁定到主线程

commented

cgo这玩意挺好玩,没有一个领头人,大哥你牵个头估计玩的人就都来了

是的,如果要做这部分工作需要探讨可以联系我 我们做过几个典型这种模式下几个典型例子,你可以参考扫两眼

https://github.com/ying32/govcl
https://github.com/aadog/py3-go

你的微信?

commented

qq 97077088