Fix close deadlock (variant A)

This commit is contained in:
Łukasz Magiera 2019-06-20 15:13:07 +02:00
parent c7aefba960
commit 071c61778e
2 changed files with 28 additions and 2 deletions

View File

@ -223,8 +223,12 @@ func (n *node) emit(event interface{}) {
n.last.Store(eval)
}
for _, ch := range n.sinks {
sinks := make([]reflect.Value, len(n.sinks))
copy(sinks, n.sinks)
n.lk.RUnlock()
for _, ch := range sinks {
ch.Send(eval)
}
n.lk.RUnlock()
}

View File

@ -304,6 +304,28 @@ func TestStateful(t *testing.T) {
}
}
func TestCloseBlocking(t *testing.T) {
bus := NewBus()
em, err := bus.Emitter(new(EventB))
if err != nil {
t.Fatal(err)
}
events := make(chan EventB)
cancel, err := bus.Subscribe(events)
if err != nil {
t.Fatal(err)
}
go func() {
em.Emit(EventB(159))
}()
time.Sleep(10 * time.Millisecond) // make sure that emit is blocked
cancel() // cancel sub
}
func testMany(t testing.TB, subs, emits, msgs int, stateful bool) {
if detectrace.WithRace() && subs+emits > 5000 {
t.SkipNow()