|
|
@@ -18,7 +18,7 @@ package compose
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
- "sync/atomic"
|
|
|
+ "sync"
|
|
|
|
|
|
"github.com/docker/compose/v2/pkg/api"
|
|
|
)
|
|
|
@@ -32,9 +32,10 @@ type logPrinter interface {
|
|
|
}
|
|
|
|
|
|
type printer struct {
|
|
|
+ sync.Mutex
|
|
|
queue chan api.ContainerEvent
|
|
|
consumer api.LogConsumer
|
|
|
- stopped atomic.Bool
|
|
|
+ stopped bool
|
|
|
}
|
|
|
|
|
|
// newLogPrinter builds a LogPrinter passing containers logs to LogConsumer
|
|
|
@@ -53,16 +54,21 @@ func (p *printer) Cancel() {
|
|
|
}
|
|
|
|
|
|
func (p *printer) Stop() {
|
|
|
- if p.stopped.CompareAndSwap(false, true) {
|
|
|
+ p.Lock()
|
|
|
+ defer p.Unlock()
|
|
|
+ if !p.stopped {
|
|
|
// only close if this is the first call to stop
|
|
|
+ p.stopped = true
|
|
|
close(p.queue)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func (p *printer) HandleEvent(event api.ContainerEvent) {
|
|
|
- // prevent deadlocking, if the printer is done, there's no reader for
|
|
|
- // queue, so this write could block indefinitely
|
|
|
- if p.stopped.Load() {
|
|
|
+ p.Lock()
|
|
|
+ defer p.Unlock()
|
|
|
+ if p.stopped {
|
|
|
+ // prevent deadlocking, if the printer is done, there's no reader for
|
|
|
+ // queue, so this write could block indefinitely
|
|
|
return
|
|
|
}
|
|
|
p.queue <- event
|