mirror of
https://github.com/libp2p/go-eventbus.git
synced 2025-03-13 10:20:10 +08:00
Fix close deadlock (variant A)
This commit is contained in:
parent
c7aefba960
commit
071c61778e
8
basic.go
8
basic.go
@ -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()
|
||||
}
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user