Skip to content

Commit f3d0d84

Browse files
authored
Merge pull request #13 from goccy/feature/fix-parallel-encoding
Fix parallel encoding
2 parents c359cc2 + b9bb609 commit f3d0d84

File tree

2 files changed

+412
-6
lines changed

2 files changed

+412
-6
lines changed

encode.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ type opcodeMap struct {
3131
}
3232

3333
type opcodeSet struct {
34-
codeIndent *opcode
35-
code *opcode
34+
codeIndent sync.Pool
35+
code sync.Pool
3636
}
3737

3838
func (m *opcodeMap) get(k uintptr) *opcodeSet {
@@ -48,6 +48,7 @@ func (m *opcodeMap) set(k uintptr, op *opcodeSet) {
4848

4949
var (
5050
encPool sync.Pool
51+
codePool sync.Pool
5152
cachedOpcode opcodeMap
5253
marshalJSONType reflect.Type
5354
marshalTextType reflect.Type
@@ -147,15 +148,20 @@ func (e *Encoder) encode(v interface{}) error {
147148
if codeSet := cachedOpcode.get(typeptr); codeSet != nil {
148149
var code *opcode
149150
if e.enabledIndent {
150-
code = codeSet.codeIndent
151+
code = codeSet.codeIndent.Get().(*opcode)
151152
} else {
152-
code = codeSet.code
153+
code = codeSet.code.Get().(*opcode)
153154
}
154155
p := uintptr(header.ptr)
155156
code.ptr = p
156157
if err := e.run(code); err != nil {
157158
return err
158159
}
160+
if e.enabledIndent {
161+
codeSet.codeIndent.Put(code)
162+
} else {
163+
codeSet.code.Put(code)
164+
}
159165
return nil
160166
}
161167

@@ -170,13 +176,25 @@ func (e *Encoder) encode(v interface{}) error {
170176
if err != nil {
171177
return err
172178
}
173-
codeSet := &opcodeSet{codeIndent: codeIndent, code: code}
179+
codeSet := &opcodeSet{
180+
codeIndent: sync.Pool{
181+
New: func() interface{} {
182+
return copyOpcode(codeIndent)
183+
},
184+
},
185+
code: sync.Pool{
186+
New: func() interface{} {
187+
return copyOpcode(code)
188+
},
189+
},
190+
}
174191
cachedOpcode.set(typeptr, codeSet)
175192
p := uintptr(header.ptr)
176-
code.ptr = p
177193
if e.enabledIndent {
194+
codeIndent.ptr = p
178195
return e.run(codeIndent)
179196
}
197+
code.ptr = p
180198
return e.run(code)
181199
}
182200

0 commit comments

Comments
 (0)