mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-02 22:49:31 +08:00
Better signal handling (#1488)
* Better signal handling * Remove waitgroup
This commit is contained in:
parent
c22f59adb9
commit
0531645377
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
}()
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user