diff options
| author | Nicolas Paul <n@nc0.fr> | 2023-05-31 23:55:49 +0200 |
|---|---|---|
| committer | Nicolas Paul <n@nc0.fr> | 2023-05-31 23:55:49 +0200 |
| commit | 553823a62a61b0155a352d5a1964f97ffdbfc6d6 (patch) | |
| tree | 5d4e6435c920c3d4aa1758d4c5d5084a9793b025 | |
| parent | eef84422175de47923ab40009a406cb9d70f6d1c (diff) | |
Fix race conditions
Signed-off-by: Nicolas Paul <n@nc0.fr>
| -rw-r--r-- | cmd/svgu/svgu.go | 8 | ||||
| -rw-r--r-- | pkg/config/lib/prelude/prelude.go | 2 | ||||
| -rw-r--r-- | pkg/config/starlark.go | 2 | ||||
| -rw-r--r-- | pkg/types/index.go | 6 | ||||
| -rw-r--r-- | pkg/types/module.go | 23 |
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 } |
