Skip to content

Commit

Permalink
Merge pull request gotk3#684 from diamondburned/fix/glib-signals-mutex
Browse files Browse the repository at this point in the history
Fixed glib signals missing mutex
  • Loading branch information
andre-hub authored Dec 10, 2020
2 parents fc7708d + e729134 commit 82632d1
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 5 deletions.
4 changes: 3 additions & 1 deletion glib/connect.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ func (v *Object) connectClosure(after bool, detailedSignal string, f interface{}
handle := SignalHandle(c)

// Map the signal handle to the closure.
signals[handle] = closure
signals.Lock()
signals.m[handle] = closure
signals.Unlock()

return handle, nil
}
Expand Down
20 changes: 16 additions & 4 deletions glib/glib.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,12 @@ var (
m: make(map[*C.GClosure]closureContext),
}

signals = make(map[SignalHandle]*C.GClosure)
signals = struct {
sync.RWMutex
m map[SignalHandle]*C.GClosure
}{
m: make(map[SignalHandle]*C.GClosure),
}
)

/*
Expand Down Expand Up @@ -867,9 +872,16 @@ func (v *Object) HandlerUnblock(handle SignalHandle) {
// HandlerDisconnect is a wrapper around g_signal_handler_disconnect().
func (v *Object) HandlerDisconnect(handle SignalHandle) {
C.g_signal_handler_disconnect(C.gpointer(v.GObject), C.gulong(handle))
C.g_closure_invalidate(signals[handle])
delete(closures.m, signals[handle])
delete(signals, handle)

signals.Lock()
closure := signals.m[handle]
C.g_closure_invalidate(closure)
delete(signals.m, handle)
signals.Unlock()

closures.Lock()
delete(closures.m, closure)
closures.Unlock()
}

// Wrapper function for new objects with reference management.
Expand Down

0 comments on commit 82632d1

Please sign in to comment.