@@ -288,17 +288,29 @@ func (r *Runner) Run(t *testing.T, files string, test TestFunc, opts ...RunOptio
288
288
289
289
type loggingFramer struct {
290
290
mu sync.Mutex
291
- buffers []* bytes.Buffer
291
+ buffers []* safeBuffer
292
+ }
293
+
294
+ // safeBuffer is a threadsafe buffer for logs.
295
+ type safeBuffer struct {
296
+ mu sync.Mutex
297
+ buf bytes.Buffer
298
+ }
299
+
300
+ func (b * safeBuffer ) Write (p []byte ) (int , error ) {
301
+ b .mu .Lock ()
302
+ defer b .mu .Unlock ()
303
+ return b .buf .Write (p )
292
304
}
293
305
294
306
func (s * loggingFramer ) framer (f jsonrpc2.Framer ) jsonrpc2.Framer {
295
307
return func (nc net.Conn ) jsonrpc2.Stream {
296
308
s .mu .Lock ()
297
- var buf bytes.Buffer
298
- s .buffers = append (s .buffers , & buf )
309
+ buf := & safeBuffer { buf : bytes.Buffer {}}
310
+ s .buffers = append (s .buffers , buf )
299
311
s .mu .Unlock ()
300
312
stream := f (nc )
301
- return protocol .LoggingStream (stream , & buf )
313
+ return protocol .LoggingStream (stream , buf )
302
314
}
303
315
}
304
316
@@ -308,9 +320,9 @@ func (s *loggingFramer) printBuffers(testname string, w io.Writer) {
308
320
309
321
for i , buf := range s .buffers {
310
322
fmt .Fprintf (os .Stderr , "#### Start Gopls Test Logs %d of %d for %q\n " , i + 1 , len (s .buffers ), testname )
311
- // Re-buffer buf to avoid a data rate (io.Copy mutates src).
312
- writeBuf := bytes . NewBuffer ( buf .Bytes () )
313
- io . Copy ( w , writeBuf )
323
+ buf . mu . Lock ()
324
+ io . Copy ( w , & buf .buf )
325
+ buf . mu . Unlock ( )
314
326
fmt .Fprintf (os .Stderr , "#### End Gopls Test Logs %d of %d for %q\n " , i + 1 , len (s .buffers ), testname )
315
327
}
316
328
}
0 commit comments