ALSA: seq: Continue broadcasting events to ports if one of them fails
authorAdam Goode <agoode@google.com>
Wed, 4 Jun 2014 15:20:55 +0000 (11:20 -0400)
committerTakashi Iwai <tiwai@suse.de>
Wed, 4 Jun 2014 15:30:58 +0000 (17:30 +0200)
commit27423257b7e6b236f0ea40d939e5842f63dac949
tree81f44740dc04be0757953c6a1961769d84317915
parent1c9b8f51251212113a8ed12836dc6ba6a14e8b33
ALSA: seq: Continue broadcasting events to ports if one of them fails

Sometimes PORT_EXIT messages are lost when a process is exiting.
This happens if you subscribe to the announce port with client A,
then subscribe to the announce port with client B, then kill client A.
Client B will not see the PORT_EXIT message because client A's port is
closing and is earlier in the announce port subscription list. The
for each loop will try to send the announcement to client A and fail,
then will stop trying to broadcast to other ports. Killing B works fine
since the announcement will already have gone to A. The CLIENT_EXIT
message does not get lost.

How to reproduce problem:

*** termA
$ aseqdump -p 0:1
  0:1   Port subscribed            0:1 -> 128:0

*** termB
$ aseqdump -p 0:1

*** termA
  0:1   Client start               client 129
  0:1   Port start                 129:0
  0:1   Port subscribed            0:1 -> 129:0

*** termB
  0:1   Port subscribed            0:1 -> 129:0

*** termA
^C

*** termB
  0:1   Client exit                client 128
   <--- expected Port exit as well (before client exit)

Signed-off-by: Adam Goode <agoode@google.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/seq/seq_clientmgr.c