5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 22:31:06 +08:00

Better signal handling (#1488)

* Better signal handling

* Remove waitgroup
This commit is contained in:
Lea Anthony 2022-06-25 09:26:17 +10:00 committed by GitHub
parent c22f59adb9
commit 0531645377
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 38 additions and 53 deletions

View File

@ -35,6 +35,8 @@ func (a *App) Run() error {
return nil
}
func (a *App) Shutdown() {}
// CreateApp creates the app!
func CreateApp(appoptions *options.App) (*App, error) {
// Set up logger

View File

@ -44,11 +44,16 @@ type App struct {
ctx context.Context
}
func (a *App) Run() error {
err := a.frontend.Run(a.ctx)
func (a *App) Shutdown() {
if a.shutdownCallback != nil {
a.shutdownCallback(a.ctx)
}
a.frontend.Quit()
}
func (a *App) Run() error {
err := a.frontend.Run(a.ctx)
a.Shutdown()
return err
}

View File

@ -34,11 +34,16 @@ type App struct {
ctx context.Context
}
func (a *App) Run() error {
err := a.frontend.Run(a.ctx)
func (a *App) Shutdown() {
if a.shutdownCallback != nil {
a.shutdownCallback(a.ctx)
}
a.frontend.Quit()
}
func (a *App) Run() error {
err := a.frontend.Run(a.ctx)
a.Shutdown()
return err
}

View File

@ -1,73 +1,39 @@
package signal
import (
"context"
"os"
gosignal "os/signal"
"sync"
"syscall"
"github.com/wailsapp/wails/v2/internal/logger"
"github.com/wailsapp/wails/v2/internal/servicebus"
)
// Manager manages signals such as CTRL-C
type Manager struct {
// Service Bus
bus *servicebus.ServiceBus
var signalChannel = make(chan os.Signal, 2)
// logger
logger logger.CustomLogger
var callbacks []func()
var lock sync.Mutex
// signalChannel
signalchannel chan os.Signal
// ctx
ctx context.Context
cancel context.CancelFunc
// Parent waitgroup
wg *sync.WaitGroup
}
// NewManager creates a new signal manager
func NewManager(ctx context.Context, cancel context.CancelFunc, bus *servicebus.ServiceBus, logger *logger.Logger) (*Manager, error) {
result := &Manager{
bus: bus,
logger: logger.CustomLogger("Signal Manager"),
signalchannel: make(chan os.Signal, 2),
ctx: ctx,
cancel: cancel,
wg: ctx.Value("waitgroup").(*sync.WaitGroup),
}
return result, nil
func OnShutdown(callback func()) {
lock.Lock()
defer lock.Unlock()
callbacks = append(callbacks, callback)
}
// Start the Signal Manager
func (m *Manager) Start() {
func Start() {
// Hook into interrupts
gosignal.Notify(m.signalchannel, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
m.wg.Add(1)
gosignal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
// Spin off signal listener and wait for either a cancellation
// or signal
go func() {
select {
case <-m.signalchannel:
println()
m.logger.Trace("Ctrl+C detected. Shutting down...")
m.bus.Publish("quit", "ctrl-c pressed")
// Start shutdown of Wails
m.cancel()
case <-m.ctx.Done():
case <-signalChannel:
println("")
println("Ctrl+C detected. Shutting down...")
for _, callback := range callbacks {
callback()
}
}
m.logger.Trace("Shutdown")
m.wg.Done()
}()
}

View File

@ -4,6 +4,7 @@ package wails
import (
app "github.com/wailsapp/wails/v2/internal/appng"
"github.com/wailsapp/wails/v2/internal/signal"
"github.com/wailsapp/wails/v2/pkg/options"
)
@ -30,5 +31,11 @@ func Run(options *options.App) error {
return err
}
signal.OnShutdown(func() {
mainapp.Shutdown()
})
signal.Start()
return mainapp.Run()
}