Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/supervisor/pkg/activation/activation.go
2500 views
1
// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package activation
6
7
import (
8
"context"
9
"net"
10
"os"
11
"sync"
12
13
"github.com/gitpod-io/gitpod/common-go/log"
14
"github.com/moredure/easygo/netpoll"
15
"golang.org/x/xerrors"
16
)
17
18
// Callback is called when a listener is written to. Receivers are expected to close socketFD.
19
type Callback func(socketFD *os.File) error
20
21
// Listen polls on the listener and calls callback when someone writes to it.
22
func Listen(ctx context.Context, l net.Listener, activate Callback) error {
23
poller, err := netpoll.New(&netpoll.Config{
24
OnWaitError: func(err error) {
25
log.WithError(err).Error("netpoll: wait loop error")
26
},
27
})
28
if err != nil {
29
return err
30
}
31
defer poller.Close()
32
33
// Get netpoll descriptor with EventRead|EventEdgeTriggered.
34
desc, err := netpoll.HandleListener(l, netpoll.EventRead|netpoll.EventEdgeTriggered)
35
if err != nil {
36
return err
37
}
38
defer desc.Close()
39
40
var (
41
runc = make(chan bool, 1)
42
once sync.Once
43
)
44
45
err = poller.Start(desc, func(ev netpoll.Event) {
46
defer once.Do(func() {
47
_ = poller.Stop(desc)
48
49
close(runc)
50
})
51
52
if ev&netpoll.EventReadHup != 0 {
53
return
54
}
55
56
runc <- true
57
})
58
if err != nil {
59
return err
60
}
61
62
select {
63
case run := <-runc:
64
if !run {
65
return nil
66
}
67
case <-ctx.Done():
68
return ctx.Err()
69
}
70
71
var f *os.File
72
switch ll := l.(type) {
73
case *net.UnixListener:
74
f, err = ll.File()
75
case *net.TCPListener:
76
f, err = ll.File()
77
default:
78
return xerrors.Errorf("unsuported listener")
79
}
80
if err != nil {
81
return err
82
}
83
return activate(f)
84
}
85
86