Skip to content

Commit 0c6f419

Browse files
committed
reduce memory usage
1 parent 26576f7 commit 0c6f419

File tree

3 files changed

+61
-22
lines changed

3 files changed

+61
-22
lines changed

modules/markup/html.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -334,14 +334,8 @@ func postProcess(ctx *RenderContext, procs []processor, input io.Reader, output
334334
}
335335
}
336336

337-
nodes = newNodes
338-
339-
// Create buffer in which the data will be placed again. We know that the
340-
// length will be at least that of res; to spare a few alloc+copy, we
341-
// reuse res, resetting its length to 0.
342-
res.Reset()
343337
// Render everything to buf.
344-
for _, node := range nodes {
338+
for _, node := range newNodes {
345339
err = html.Render(output, node)
346340
if err != nil {
347341
return &postProcessError{"error rendering processed HTML", err}

modules/markup/markdown/markdown.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ func actualRender(ctx *markup.RenderContext, input io.Reader, output io.Writer)
185185
_ = lw.CloseWithError(fmt.Errorf("%v", err))
186186
}()
187187

188+
// FIXME: Don't read all to memory, but goldmark doesn't support
188189
pc := NewGiteaParseContext(ctx)
189190
buf, err := ioutil.ReadAll(giteautil.NormalizeEOLReader(input))
190191
if err != nil {

modules/markup/renderer.go

Lines changed: 59 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"io"
1212
"path/filepath"
1313
"strings"
14+
"sync"
1415

1516
"code.gitea.io/gitea/modules/setting"
1617
)
@@ -94,33 +95,76 @@ func RenderString(ctx *RenderContext, content string) (string, error) {
9495
}
9596

9697
func render(ctx *RenderContext, parser Renderer, input io.Reader, output io.Writer) error {
97-
var buf1 strings.Builder
98-
if err := parser.Render(ctx, input, &buf1); err != nil {
99-
return err
98+
var wg sync.WaitGroup
99+
var err error
100+
pr, pw := io.Pipe()
101+
defer func() {
102+
_ = pr.Close()
103+
_ = pw.Close()
104+
}()
105+
106+
pr2, pw2 := io.Pipe()
107+
defer func() {
108+
_ = pr2.Close()
109+
_ = pw2.Close()
110+
}()
111+
112+
wg.Add(1)
113+
go func() {
114+
buf := SanitizeReader(pr2)
115+
_, err = io.Copy(output, buf)
116+
_ = pr2.Close()
117+
wg.Done()
118+
}()
119+
120+
wg.Add(1)
121+
go func() {
122+
err = PostProcess(ctx, pr, pw2)
123+
_ = pr.Close()
124+
_ = pw2.Close()
125+
wg.Done()
126+
}()
127+
128+
if err1 := parser.Render(ctx, input, pw); err1 != nil {
129+
return err1
100130
}
131+
_ = pw.Close()
101132

102-
var buf2 strings.Builder
103-
if err := PostProcess(ctx, strings.NewReader(buf1.String()), &buf2); err != nil {
104-
return fmt.Errorf("PostProcess: %v", err)
105-
}
106-
buf := SanitizeReader(strings.NewReader(buf2.String()))
107-
_, err := io.Copy(output, buf)
133+
wg.Wait()
108134
return err
109135
}
110136

137+
// ErrUnsupportedRenderType represents
138+
type ErrUnsupportedRenderType struct {
139+
Type string
140+
}
141+
142+
func (err ErrUnsupportedRenderType) Error() string {
143+
return fmt.Sprintf("Unsupported render type: %s", err.Type)
144+
}
145+
111146
func renderByType(ctx *RenderContext, input io.Reader, output io.Writer) error {
112-
if parser, ok := renderers[ctx.Type]; ok {
113-
return render(ctx, parser, input, output)
147+
if renderer, ok := renderers[ctx.Type]; ok {
148+
return render(ctx, renderer, input, output)
114149
}
115-
return nil
150+
return ErrUnsupportedRenderType{ctx.Type}
151+
}
152+
153+
// ErrUnsupportedRenderExtension represents the error when extension doesn't supported to render
154+
type ErrUnsupportedRenderExtension struct {
155+
Extension string
156+
}
157+
158+
func (err ErrUnsupportedRenderExtension) Error() string {
159+
return fmt.Sprintf("Unsupported render extension: %s", err.Extension)
116160
}
117161

118162
func renderFile(ctx *RenderContext, input io.Reader, output io.Writer) error {
119163
extension := strings.ToLower(filepath.Ext(ctx.Filename))
120-
if parser, ok := extRenderers[extension]; ok {
121-
return render(ctx, parser, input, output)
164+
if renderer, ok := extRenderers[extension]; ok {
165+
return render(ctx, renderer, input, output)
122166
}
123-
return nil
167+
return ErrUnsupportedRenderExtension{extension}
124168
}
125169

126170
// Type returns if markup format via the filename

0 commit comments

Comments
 (0)