diff --git a/c/pthread/sync/_pthd/pthd.c b/c/pthread/sync/_pthd/pthd.c new file mode 100644 index 00000000..453bbe4d --- /dev/null +++ b/c/pthread/sync/_pthd/pthd.c @@ -0,0 +1,6 @@ +#include + +pthread_once_t llgoSyncOnceInitVal() { + pthread_once_t initVal = PTHREAD_ONCE_INIT; + return initVal; +} diff --git a/c/pthread/sync/llgo_autogen.lla b/c/pthread/sync/llgo_autogen.lla new file mode 100644 index 00000000..e1b6d0eb Binary files /dev/null and b/c/pthread/sync/llgo_autogen.lla differ diff --git a/c/pthread/sync/sync.go b/c/pthread/sync/sync.go new file mode 100644 index 00000000..2ddf2ee9 --- /dev/null +++ b/c/pthread/sync/sync.go @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package sync + +// #include +import "C" + +import ( + _ "unsafe" + + "github.com/goplus/llgo/c" +) + +const ( + LLGoFiles = "_pthd/pthd.c" + LLGoPackage = "link" +) + +type Once C.pthread_once_t + +//go:linkname onceInitVal C.llgoSyncOnceInitVal +func onceInitVal() Once + +var OnceInit = onceInitVal() + +// llgo:link (*Once).Do C.pthread_once +func (o *Once) Do(f func()) c.Int { return 0 } diff --git a/cl/_testlibc/once/in.go b/cl/_testlibc/once/in.go new file mode 100644 index 00000000..e7247122 --- /dev/null +++ b/cl/_testlibc/once/in.go @@ -0,0 +1,19 @@ +package main + +import ( + "github.com/goplus/llgo/c" + "github.com/goplus/llgo/c/pthread/sync" +) + +var once sync.Once = sync.OnceInit + +func f() { + once.Do(func() { + c.Printf(c.Str("Do once\n")) + }) +} + +func main() { + f() + f() +} diff --git a/cl/_testlibc/once/out.ll b/cl/_testlibc/once/out.ll new file mode 100644 index 00000000..1c8a0e79 --- /dev/null +++ b/cl/_testlibc/once/out.ll @@ -0,0 +1 @@ +; \ No newline at end of file diff --git a/internal/build/build.go b/internal/build/build.go index d115f7c6..e1ed2f73 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -597,7 +597,7 @@ func llgoPkgLinkFiles(pkg *packages.Package, llFile string, procFile func(linkFi // files = "file1; file2; ..." func clFiles(files string, pkg *packages.Package, procFile func(linkFile string), verbose bool) { - dir := filepath.Dir(pkg.CompiledGoFiles[0]) + dir := filepath.Dir(pkg.GoFiles[0]) expFile := pkg.ExportFile for _, file := range strings.Split(files, ";") { cFile := filepath.Join(dir, strings.TrimSpace(file))