diff options
author | Takashi Iwai <tiwai@suse.de> | 2016-01-21 17:43:08 +0100 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2016-01-21 17:51:42 +0100 |
commit | 40ed9444cd2421cceedb35bb8d8ff913a5ae1ac3 (patch) | |
tree | 101052484faf68fcb87959730793d3518731abe6 /sound | |
parent | ALSA: timer: Handle disconnection more safely (diff) | |
download | linux-40ed9444cd2421cceedb35bb8d8ff913a5ae1ac3.tar.xz linux-40ed9444cd2421cceedb35bb8d8ff913a5ae1ac3.zip |
ALSA: timer: Introduce disconnect op to snd_timer_instance
Instead of the previous ugly hack, introduce a new op, disconnect, to
snd_timer_instance object for handling the wake up of pending tasks
more cleanly.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=109431
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/timer.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/sound/core/timer.c b/sound/core/timer.c index 681fb051b9eb..af1f68f7e315 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -899,11 +899,6 @@ static int snd_timer_dev_register(struct snd_device *dev) return 0; } -/* just for reference in snd_timer_dev_disconnect() below */ -static void snd_timer_user_ccallback(struct snd_timer_instance *timeri, - int event, struct timespec *tstamp, - unsigned long resolution); - static int snd_timer_dev_disconnect(struct snd_device *device) { struct snd_timer *timer = device->device_data; @@ -913,13 +908,8 @@ static int snd_timer_dev_disconnect(struct snd_device *device) list_del_init(&timer->device_list); /* wake up pending sleepers */ list_for_each_entry(ti, &timer->open_list_head, open_list) { - /* FIXME: better to have a ti.disconnect() op */ - if (ti->ccallback == snd_timer_user_ccallback) { - struct snd_timer_user *tu = ti->callback_data; - - tu->disconnected = true; - wake_up(&tu->qchange_sleep); - } + if (ti->disconnect) + ti->disconnect(ti); } mutex_unlock(®ister_mutex); return 0; @@ -1227,6 +1217,14 @@ static void snd_timer_user_ccallback(struct snd_timer_instance *timeri, wake_up(&tu->qchange_sleep); } +static void snd_timer_user_disconnect(struct snd_timer_instance *timeri) +{ + struct snd_timer_user *tu = timeri->callback_data; + + tu->disconnected = true; + wake_up(&tu->qchange_sleep); +} + static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri, unsigned long resolution, unsigned long ticks) @@ -1600,6 +1598,7 @@ static int snd_timer_user_tselect(struct file *file, ? snd_timer_user_tinterrupt : snd_timer_user_interrupt; tu->timeri->ccallback = snd_timer_user_ccallback; tu->timeri->callback_data = (void *)tu; + tu->timeri->disconnect = snd_timer_user_disconnect; } __err: |