mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 07:35:40 +00:00
app: [Wayland] avoid a race on the send side of the wakeup pipe
Discovered while debugging #528 with -race. References: https://todo.sr.ht/~eliasnaur/gio/528 Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
+11
-1
@@ -94,7 +94,10 @@ type wlDisplay struct {
|
||||
|
||||
// Notification pipe fds.
|
||||
notify struct {
|
||||
read, write int
|
||||
read int
|
||||
|
||||
mu sync.Mutex
|
||||
write int
|
||||
}
|
||||
|
||||
repeat repeatState
|
||||
@@ -1442,6 +1445,11 @@ func (w *window) SetAnimating(anim bool) {
|
||||
// Wakeup wakes up the event loop through the notification pipe.
|
||||
func (d *wlDisplay) wakeup() {
|
||||
oneByte := make([]byte, 1)
|
||||
d.notify.mu.Lock()
|
||||
defer d.notify.mu.Unlock()
|
||||
if d.notify.write == 0 {
|
||||
return
|
||||
}
|
||||
if _, err := syscall.Write(d.notify.write, oneByte); err != nil && err != syscall.EAGAIN {
|
||||
panic(fmt.Errorf("failed to write to pipe: %v", err))
|
||||
}
|
||||
@@ -1820,10 +1828,12 @@ func newWLDisplay() (*wlDisplay, error) {
|
||||
}
|
||||
|
||||
func (d *wlDisplay) destroy() {
|
||||
d.notify.mu.Lock()
|
||||
if d.notify.write != 0 {
|
||||
syscall.Close(d.notify.write)
|
||||
d.notify.write = 0
|
||||
}
|
||||
d.notify.mu.Unlock()
|
||||
if d.notify.read != 0 {
|
||||
syscall.Close(d.notify.read)
|
||||
d.notify.read = 0
|
||||
|
||||
Reference in New Issue
Block a user