feat(c/libuv/demo): Add libuv async_fs demo

Signed-off-by: hackerchai <i@hackerchai.com>

fix(c/libuv): fix fs demo

Signed-off-by: hackerchai <i@hackerchai.com>

refactor(c/libuv): neat comment and adapt merge

Signed-off-by: hackerchai <i@hackerchai.com>
This commit is contained in:
hackerchai
2024-07-23 11:01:28 +08:00
parent db6930d9e4
commit 545f9f2cca
4 changed files with 163 additions and 21 deletions

70
c/libuv/_demo/libuv/fs.go Normal file
View File

@@ -0,0 +1,70 @@
package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/libuv"
"github.com/goplus/llgo/c/os"
"golang.org/x/tools/container/intsets"
"unsafe"
)
const bufferSize = 1024
var buffer []c.Char
var iov libuv.Buf
var loop *libuv.Loop
var readReq *libuv.Fs
var closeReq *libuv.Fs
var openReq *libuv.Fs
func initBuffer() {
buffer = make([]c.Char, bufferSize)
}
func main() {
loop = libuv.DefaultLoop()
initBuffer()
file := libuv.NewFile(loop, openReq)
path := c.Str("example.txt")
file.Open(path, os.O_RDONLY, 0, onOpen)
loop.Run(libuv.RUN_DEFAULT)
libuv.FsReqCleanup(openReq)
loop.Close()
c.Free(unsafe.Pointer(loop))
}
func onOpen(req *libuv.Fs) {
if req.GetResult() < 0 {
c.Fprintf(c.Stderr, c.Str("Error opening file: %s\n"), libuv.Strerror(req.GetResult()))
} else {
iov = libuv.InitBuf(unsafe.SliceData(buffer), c.Uint(unsafe.Sizeof(buffer)))
libuv.FsRead(loop, readReq, req.GetResult(), []libuv.Buf{iov}, 1, -1, onRead)
}
libuv.FsReqCleanup(req)
}
func onRead(req *libuv.Fs) {
if req.GetResult() < 0 {
c.Fprintf(c.Stderr, c.Str("Read error: %s\n"), libuv.Strerror(req.GetResult()))
} else if req.GetResult() == 0 {
libuv.FsClose(loop, closeReq, req.GetResult(), onClose)
} else {
if req.GetResult() > intsets.MaxInt {
c.Fprintf(c.Stderr, c.Str("Too big file.\n"))
}
c.Printf(c.Str("%.*s"), c.Int(req.GetResult()), buffer)
libuv.FsRead(loop, req, req.GetResult(), []libuv.Buf{iov}, 1, -1, onRead)
}
libuv.FsReqCleanup(req)
}
func onClose(req *libuv.Fs) {
c.Printf(c.Str("\nFile closed.\n"))
libuv.FsReqCleanup(req)
}