@@ -243,12 +243,21 @@ type internalBufferedLiveLoggerData struct {
243243 logfinished chan struct {}
244244}
245245
246- // IsZero returns true if the struct is closed
246+ // isZero returns true if the struct is closed
247247// * internalBufferedLiveLoggerData is replaced by a zero struct instead of nil to not auto restart
248- func (i * internalBufferedLiveLoggerData ) IsZero () bool {
248+ func (i * internalBufferedLiveLoggerData ) isZero () bool {
249249 return i == nil || i .logchan == nil || i .logdrain == nil || i .logfinished == nil
250250}
251251
252+ func (i * internalBufferedLiveLoggerData ) queueLog (wrapper * protocol.TimelineRecordFeedLinesWrapper ) error {
253+ select {
254+ case <- i .logdrain :
255+ return errors .New ("buffered live logger closing" )
256+ case i .logchan <- wrapper :
257+ return nil
258+ }
259+ }
260+
252261type BufferedLiveLogger struct {
253262 LiveLogger
254263 data atomic.Pointer [internalBufferedLiveLoggerData ]
@@ -322,7 +331,7 @@ func (logger *BufferedLiveLogger) sendLogs(logchan chan *protocol.TimelineRecord
322331}
323332
324333func (logger * BufferedLiveLogger ) Close () error {
325- if data := logger .data .Swap (& internalBufferedLiveLoggerData {}); ! data .IsZero () {
334+ if data := logger .data .Swap (& internalBufferedLiveLoggerData {}); ! data .isZero () {
326335 // Keep logchan open to avoid races and just let it be freed
327336 close (data .logdrain )
328337 <- data .logfinished
@@ -333,15 +342,10 @@ func (logger *BufferedLiveLogger) Close() error {
333342func (logger * BufferedLiveLogger ) SendLog (wrapper * protocol.TimelineRecordFeedLinesWrapper ) error {
334343 for {
335344 if data := logger .data .Load (); data != nil {
336- if data .IsZero () {
345+ if data .isZero () {
337346 return errors .New ("buffered live logger is closed" )
338347 }
339- select {
340- case <- data .logdrain :
341- return errors .New ("buffered live logger closing" )
342- case data .logchan <- wrapper :
343- return nil
344- }
348+ return data .queueLog (wrapper )
345349 } else {
346350 ndata := internalBufferedLiveLoggerData {
347351 logchan : make (chan * protocol.TimelineRecordFeedLinesWrapper , websocketPingSize ),
@@ -350,12 +354,7 @@ func (logger *BufferedLiveLogger) SendLog(wrapper *protocol.TimelineRecordFeedLi
350354 }
351355 if logger .data .CompareAndSwap (data , & ndata ) {
352356 go logger .sendLogs (ndata .logchan , ndata .logdrain , ndata .logfinished )
353- select {
354- case <- ndata .logdrain :
355- return errors .New ("buffered live logger closing" )
356- case ndata .logchan <- wrapper :
357- return nil
358- }
357+ return data .queueLog (wrapper )
359358 } else {
360359 close (ndata .logchan )
361360 close (ndata .logfinished )
0 commit comments