summaryrefslogtreecommitdiffstats
path: root/hugolib
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-03-07 09:55:17 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2017-03-27 15:43:56 +0200
commit03122e51fa41d0a289054eedc2d6fffd7f9f2e0b (patch)
treed11beb8f032f2f72936e4f0ed6fbc9c9f68cdd85 /hugolib
parente5200ddaa4d44934cec2ffbbb02a51ff69488c14 (diff)
hugolib: Revert to using Page as the render chan type
Changing it to PageOutput was a mistake. You may think that the increased parallelism should be a good thing. But not so much with the increased lock contention and more complex concurrency model.
Diffstat (limited to 'hugolib')
-rw-r--r--hugolib/page_output.go6
-rw-r--r--hugolib/site_render.go61
2 files changed, 35 insertions, 32 deletions
diff --git a/hugolib/page_output.go b/hugolib/page_output.go
index 79b7ead9a..50605bddf 100644
--- a/hugolib/page_output.go
+++ b/hugolib/page_output.go
@@ -25,9 +25,11 @@ type PageOutput struct {
outputType output.Type
}
-func newPageOutput(p *Page, outputType output.Type) *PageOutput {
+func newPageOutput(p *Page, createCopy bool, outputType output.Type) *PageOutput {
// TODO(bep) output avoid copy of first?
- p = p.copy()
+ if createCopy {
+ p = p.copy()
+ }
return &PageOutput{Page: p, outputType: outputType}
}
diff --git a/hugolib/site_render.go b/hugolib/site_render.go
index 53873f6fc..54cba59bc 100644
--- a/hugolib/site_render.go
+++ b/hugolib/site_render.go
@@ -20,8 +20,9 @@ import (
"sync"
"time"
- bp "github.com/spf13/hugo/bufferpool"
"github.com/spf13/hugo/output"
+
+ bp "github.com/spf13/hugo/bufferpool"
)
// renderPages renders pages each corresponding to a markdown file.
@@ -29,7 +30,7 @@ import (
func (s *Site) renderPages() error {
results := make(chan error)
- pages := make(chan *PageOutput)
+ pages := make(chan *Page)
errs := make(chan error)
go errorCollator(results, errs)
@@ -44,9 +45,7 @@ func (s *Site) renderPages() error {
}
for _, page := range s.Pages {
- for _, outputType := range page.outputTypes {
- pages <- newPageOutput(page, outputType)
- }
+ pages <- page
}
close(pages)
@@ -62,43 +61,45 @@ func (s *Site) renderPages() error {
return nil
}
-func pageRenderer(s *Site, pages <-chan *PageOutput, results chan<- error, wg *sync.WaitGroup) {
+func pageRenderer(s *Site, pages <-chan *Page, results chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
- for p := range pages {
- // TODO(bep) output check if some of the interface{} methods below checks for *Page
- var layouts []string
+ for page := range pages {
+ for i, outputType := range page.outputTypes {
+ pageOutput := newPageOutput(page, i > 0, outputType)
- if len(p.layoutsCalculated) > 0 {
- // TODO(bep) output
- layouts = p.layoutsCalculated
- } else {
- layouts = s.layoutHandler.For(p.layoutIdentifier, "", p.outputType)
- }
+ var layouts []string
- switch p.outputType {
+ if len(pageOutput.layoutsCalculated) > 0 {
+ // TODO(bep) output
+ layouts = pageOutput.layoutsCalculated
+ } else {
+ layouts = s.layoutHandler.For(pageOutput.layoutIdentifier, "", pageOutput.outputType)
+ }
- case output.HTMLType:
- targetPath := p.TargetPath()
+ switch pageOutput.outputType {
- s.Log.DEBUG.Printf("Render %s to %q with layouts %q", p.Kind, targetPath, layouts)
+ case output.HTMLType:
+ targetPath := pageOutput.TargetPath()
- if err := s.renderAndWritePage("page "+p.FullFilePath(), targetPath, p, layouts...); err != nil {
- results <- err
- }
+ s.Log.DEBUG.Printf("Render %s to %q with layouts %q", pageOutput.Kind, targetPath, layouts)
- // Taxonomy terms have no page set to paginate, so skip that for now.
- if p.IsNode() {
- if err := s.renderPaginator(p); err != nil {
+ if err := s.renderAndWritePage("page "+pageOutput.FullFilePath(), targetPath, pageOutput, layouts...); err != nil {
results <- err
}
- }
- case output.RSSType:
- if err := s.renderRSS(p); err != nil {
- results <- err
+ // Taxonomy terms have no page set to paginate, so skip that for now.
+ if pageOutput.IsNode() {
+ if err := s.renderPaginator(pageOutput); err != nil {
+ results <- err
+ }
+ }
+
+ case output.RSSType:
+ if err := s.renderRSS(pageOutput); err != nil {
+ results <- err
+ }
}
}
-
}
}