summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Paul <n@nc0.fr>2023-05-31 23:55:49 +0200
committerNicolas Paul <n@nc0.fr>2023-05-31 23:55:49 +0200
commit553823a62a61b0155a352d5a1964f97ffdbfc6d6 (patch)
tree5d4e6435c920c3d4aa1758d4c5d5084a9793b025
parenteef84422175de47923ab40009a406cb9d70f6d1c (diff)
Fix race conditions
Signed-off-by: Nicolas Paul <n@nc0.fr>
-rw-r--r--cmd/svgu/svgu.go8
-rw-r--r--pkg/config/lib/prelude/prelude.go2
-rw-r--r--pkg/config/starlark.go2
-rw-r--r--pkg/types/index.go6
-rw-r--r--pkg/types/module.go23
5 files changed, 28 insertions, 13 deletions
diff --git a/cmd/svgu/svgu.go b/cmd/svgu/svgu.go
index a9d81f6..cd765e8 100644
--- a/cmd/svgu/svgu.go
+++ b/cmd/svgu/svgu.go
@@ -15,7 +15,7 @@ var (
cfg = flag.String("c", "DOMAINS.star", "the configuration file to use.")
out = flag.String("o", "dst", "output directory")
verbose = flag.Bool("v", false, "prints additional information logs")
-) // todo(nc0): verbose
+)
func main() {
log.SetFlags(0)
@@ -86,14 +86,18 @@ func main() {
}
var wg sync.WaitGroup
+ var mu sync.Mutex
for _, mod := range idx.Modules {
wg.Add(1)
go func(m *types.Module) {
defer wg.Done()
+ defer mu.Unlock()
+
+ mu.Lock()
if err := m.GenerateFile(*out, idx.Domain); err != nil {
log.Fatalf("could not generate module %q: %v", m.Path, err)
}
- }(&mod)
+ }(mod)
}
wg.Wait()
diff --git a/pkg/config/lib/prelude/prelude.go b/pkg/config/lib/prelude/prelude.go
index c1e42f4..c703625 100644
--- a/pkg/config/lib/prelude/prelude.go
+++ b/pkg/config/lib/prelude/prelude.go
@@ -81,7 +81,7 @@ func InternModule(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tuple,
return nil, fmt.Errorf("unknown vcs %q", vcs)
}
- Registered.AddModule(name, types.Module{
+ Registered.AddModule(name, &types.Module{
Path: name,
Vcs: v,
Repo: repo,
diff --git a/pkg/config/starlark.go b/pkg/config/starlark.go
index d739a4a..c8a2998 100644
--- a/pkg/config/starlark.go
+++ b/pkg/config/starlark.go
@@ -30,7 +30,7 @@ func ExecConfig(fl string) (*types.Index, error) {
prelude.Registered = types.Index{
Domain: "",
- Modules: make(map[string]types.Module),
+ Modules: make(map[string]*types.Module),
}
if _, err := starlark.ExecFile(th, fl, nil, env); err != nil {
return &types.Index{}, err
diff --git a/pkg/types/index.go b/pkg/types/index.go
index 623555c..ebb6f52 100644
--- a/pkg/types/index.go
+++ b/pkg/types/index.go
@@ -10,7 +10,7 @@ import (
// Index is the global object representing the Starlark configuration.
type Index struct {
Domain string
- Modules map[string]Module
+ Modules map[string]*Module
// internal
lock sync.Mutex
}
@@ -23,14 +23,14 @@ func (i *Index) SetDomain(d string) {
}
// AddModule adds a module to the index.
-func (i *Index) AddModule(n string, m Module) {
+func (i *Index) AddModule(n string, m *Module) {
i.lock.Lock()
defer i.lock.Unlock()
i.Modules[n] = m
}
// GetModule returns a module from the index.
-func (i *Index) GetModule(n string) Module {
+func (i *Index) GetModule(n string) *Module {
i.lock.Lock()
defer i.lock.Unlock()
return i.Modules[n]
diff --git a/pkg/types/module.go b/pkg/types/module.go
index e0ec5ea..ad3208f 100644
--- a/pkg/types/module.go
+++ b/pkg/types/module.go
@@ -6,6 +6,7 @@ import (
"os"
"path"
"strings"
+ "sync"
)
// Vcs is an enum for version control systems supported by the standard Go
@@ -30,21 +31,31 @@ type Module struct {
Repo string // repository's home
Dir string // url template
File string // url template
+
+ // internal
+ mu sync.Mutex
}
// GenerateFile generates the index file.
func (m *Module) GenerateFile(out string, domain string) error {
+ m.mu.Lock()
+ p := m.Path
+ v := m.Vcs
+ r := m.Repo
+ d := m.Dir
+ f := m.File
+ m.mu.Unlock()
- f := path.Join(out, m.Path+".html")
+ outf := path.Join(out, p+".html")
// Create the file.
- if strings.Contains(m.Path, "/") {
- if err := os.MkdirAll(path.Dir(f), 0755); err != nil {
+ if strings.Contains(p, "/") {
+ if err := os.MkdirAll(path.Dir(outf), 0755); err != nil {
return err
}
}
- fd, err := os.Create(f)
+ fd, err := os.Create(outf)
if err != nil {
return err
}
@@ -57,8 +68,8 @@ func (m *Module) GenerateFile(out string, domain string) error {
// Execute the template and write the output to the file.
if err := templates.ExecModule(fd,
- fmt.Sprintf("%s/%s", domain, m.Path), string(m.Vcs),
- m.Repo, m.Dir, m.File); err != nil {
+ fmt.Sprintf("%s/%s", domain, p), string(v), r,
+ d, f); err != nil {
return err
}