3f646c66d693c88692d0bebd4243349ddb515ed8

Author
Ayman Bagabas <ayman.bagabas@gmail.com>
Committer
Ayman Bagabas <ayman.bagabas@gmail.com>
Date

Message

fix(daemon): mutex for listeners

Diff

 1diff --git a/pkg/daemon/daemon.go b/pkg/daemon/daemon.go
 2index bbcdaa52bf3934d528a5311debc114b5f5bfe687..3afe5e766b7765fb78321e6d5e80dad1f65e65b4 100644
 3--- a/pkg/daemon/daemon.go
 4+++ b/pkg/daemon/daemon.go
 5@@ -55,6 +55,7 @@ type GitDaemon struct {
 6 	logger    *log.Logger
 7 	done      atomic.Bool // indicates if the server has been closed
 8 	listeners []net.Listener
 9+	liMu      sync.Mutex
10 }
11 
12 // NewDaemon returns a new Git daemon.
13@@ -93,7 +94,9 @@ func (d *GitDaemon) Serve(listener net.Listener) error {
14 
15 	d.wg.Add(1)
16 	defer d.wg.Done()
17+	d.liMu.Lock()
18 	d.listeners = append(d.listeners, listener)
19+	d.liMu.Unlock()
20 
21 	var tempDelay time.Duration
22 	for {
23@@ -324,12 +327,14 @@ func (d *GitDaemon) closeListener() error {
24 		return ErrServerClosed
25 	}
26 	var err error
27+	d.liMu.Lock()
28 	for _, l := range d.listeners {
29 		if err = l.Close(); err != nil {
30 			err = errors.Join(err, fmt.Errorf("close listener %s: %w", l.Addr(), err))
31 		}
32 	}
33 	d.listeners = d.listeners[:0]
34+	d.liMu.Unlock()
35 	d.once.Do(func() {
36 		d.done.Store(true)
37 		close(d.finished)