From a8641672cd09ba1abf3c922c5b5c384f6283fe83 Mon Sep 17 00:00:00 2001 From: 5aaee9 <7685264+5aaee9@users.noreply.github.com> Date: Sat, 14 Oct 2023 09:34:00 +0000 Subject: [PATCH] [v3] fix deadlock when quit (#2982) * fix: dead lock when quit * docs: update changelog --- mkdocs-website/docs/changelog.md | 2 ++ v3/pkg/application/application.go | 30 +++++++++++++++--------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/mkdocs-website/docs/changelog.md b/mkdocs-website/docs/changelog.md index fa53f4f2..ac49df1f 100644 --- a/mkdocs-website/docs/changelog.md +++ b/mkdocs-website/docs/changelog.md @@ -24,6 +24,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- [darwin] Fixed application frozen when quit by @5aaee9 in + [#2982](https://github.com/wailsapp/wails/pull/2982) - Fixed background colours of examples on Windows by [mmgvh](https://github.com/mmghv) in [#2750](https://github.com/wailsapp/wails/pull/2750). diff --git a/v3/pkg/application/application.go b/v3/pkg/application/application.go index 3f451322..0a2dd4f9 100644 --- a/v3/pkg/application/application.go +++ b/v3/pkg/application/application.go @@ -235,7 +235,7 @@ type App struct { // Windows windows map[uint]Window - windowsLock sync.Mutex + windowsLock sync.RWMutex // System Trays systemTrays map[uint]*SystemTray @@ -301,8 +301,8 @@ func (a *App) getSystemTrayID() uint { } func (a *App) getWindowForID(id uint) Window { - a.windowsLock.Lock() - defer a.windowsLock.Unlock() + a.windowsLock.RLock() + defer a.windowsLock.RUnlock() return a.windows[id] } @@ -539,9 +539,9 @@ func (a *App) handleDragAndDropMessage(event *dragAndDropMessage) { func (a *App) handleWindowMessage(event *windowMessage) { // Get window from window map - a.windowsLock.Lock() + a.windowsLock.RLock() window, ok := a.windows[event.windowId] - a.windowsLock.Unlock() + a.windowsLock.RUnlock() if !ok { log.Printf("WebviewWindow #%d not found", event.windowId) return @@ -556,9 +556,9 @@ func (a *App) handleWebViewRequest(request *webViewAssetRequest) { func (a *App) handleWindowEvent(event *windowEvent) { // Get window from window map - a.windowsLock.Lock() + a.windowsLock.RLock() window, ok := a.windows[event.WindowID] - a.windowsLock.Unlock() + a.windowsLock.RUnlock() if !ok { log.Printf("Window #%d not found", event.WindowID) return @@ -580,18 +580,18 @@ func (a *App) CurrentWindow() *WebviewWindow { return nil } id := a.impl.getCurrentWindowID() - a.windowsLock.Lock() - defer a.windowsLock.Unlock() + a.windowsLock.RLock() + defer a.windowsLock.RUnlock() return a.windows[id].(*WebviewWindow) } func (a *App) Quit() { InvokeSync(func() { - a.windowsLock.Lock() + a.windowsLock.RLock() for _, window := range a.windows { window.Destroy() } - a.windowsLock.Unlock() + a.windowsLock.RUnlock() a.systemTraysLock.Lock() for _, systray := range a.systemTrays { systray.Destroy() @@ -729,8 +729,8 @@ func (a *App) OnWindowCreation(callback func(window Window)) { } func (a *App) GetWindowByName(name string) Window { - a.windowsLock.Lock() - defer a.windowsLock.Unlock() + a.windowsLock.RLock() + defer a.windowsLock.RUnlock() for _, window := range a.windows { if window.Name() == name { return window @@ -772,9 +772,9 @@ func (a *App) processKeyBinding(acceleratorString string, window *WebviewWindow) func (a *App) handleWindowKeyEvent(event *windowKeyEvent) { // Get window from window map - a.windowsLock.Lock() + a.windowsLock.RLock() window, ok := a.windows[event.windowId] - a.windowsLock.Unlock() + a.windowsLock.RUnlock() if !ok { log.Printf("WebviewWindow #%d not found", event.windowId) return