Skip to content

Commit

Permalink
Improve interrupt signal handling (#134)
Browse files Browse the repository at this point in the history
Signed-off-by: Denis Vaumoron <dvaumoron@gmail.com>
  • Loading branch information
dvaumoron committed May 16, 2024
1 parent c44c62c commit 53f420d
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 8 deletions.
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4=
github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI=
github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg=
Expand Down
22 changes: 18 additions & 4 deletions pkg/lockfile/lockfile.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,27 @@ func Write(dirPath string, displayer loghelper.Displayer) func() {
})
}

func CleanAndExitOnInterrupt(clean func()) {
// the returned function may be used to avoid goroutine leak
// (also avoid conflicting behavior with versionmanager/proxy.transmitIncreasingSignal).
func CleanAndExitOnInterrupt(clean func()) func() {
signalChan := make(chan os.Signal)
endChan := make(chan struct{})
signal.Notify(signalChan, os.Interrupt)
go func() {
for range signalChan {
clean()
os.Exit(1)
for {
select {
case <-signalChan:
clean()
os.Exit(1)
case <-endChan:
signal.Stop(signalChan)

break
}
}
}()

return sync.OnceFunc(func() { //nolint
endChan <- struct{}{}
})
}
6 changes: 4 additions & 2 deletions versionmanager/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,8 @@ func (m VersionManager) Uninstall(requestedVersion string) error {
}

deleteLock := lockfile.Write(installPath, m.conf.Displayer)
lockfile.CleanAndExitOnInterrupt(deleteLock)
disableExit := lockfile.CleanAndExitOnInterrupt(deleteLock)
defer disableExit()
defer deleteLock()

cleanedVersion := parsedVersion.String()
Expand Down Expand Up @@ -333,7 +334,8 @@ func (m VersionManager) installSpecificVersion(version string, proxyCall bool) e
}

deleteLock := lockfile.Write(installPath, m.conf.Displayer)
lockfile.CleanAndExitOnInterrupt(deleteLock)
disableExit := lockfile.CleanAndExitOnInterrupt(deleteLock)
defer disableExit()
defer deleteLock()

entries, err := os.ReadDir(installPath)
Expand Down

0 comments on commit 53f420d

Please sign in to comment.