Commit 68f014a5 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: seq: fifo: Use guard() for locking

We can simplify the code gracefully with new guard() macro and co for
automatic cleanup of locks.

Only the code refactoring, and no functional changes.
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
Link: https://lore.kernel.org/r/20240227085306.9764-13-tiwai@suse.de
parent 742ecf3c
...@@ -88,12 +88,11 @@ void snd_seq_fifo_clear(struct snd_seq_fifo *f) ...@@ -88,12 +88,11 @@ void snd_seq_fifo_clear(struct snd_seq_fifo *f)
atomic_set(&f->overflow, 0); atomic_set(&f->overflow, 0);
snd_use_lock_sync(&f->use_lock); snd_use_lock_sync(&f->use_lock);
spin_lock_irq(&f->lock); guard(spinlock_irq)(&f->lock);
/* drain the fifo */ /* drain the fifo */
while ((cell = fifo_cell_out(f)) != NULL) { while ((cell = fifo_cell_out(f)) != NULL) {
snd_seq_cell_free(cell); snd_seq_cell_free(cell);
} }
spin_unlock_irq(&f->lock);
} }
...@@ -102,7 +101,6 @@ int snd_seq_fifo_event_in(struct snd_seq_fifo *f, ...@@ -102,7 +101,6 @@ int snd_seq_fifo_event_in(struct snd_seq_fifo *f,
struct snd_seq_event *event) struct snd_seq_event *event)
{ {
struct snd_seq_event_cell *cell; struct snd_seq_event_cell *cell;
unsigned long flags;
int err; int err;
if (snd_BUG_ON(!f)) if (snd_BUG_ON(!f))
...@@ -118,15 +116,15 @@ int snd_seq_fifo_event_in(struct snd_seq_fifo *f, ...@@ -118,15 +116,15 @@ int snd_seq_fifo_event_in(struct snd_seq_fifo *f,
} }
/* append new cells to fifo */ /* append new cells to fifo */
spin_lock_irqsave(&f->lock, flags); scoped_guard(spinlock_irqsave, &f->lock) {
if (f->tail != NULL) if (f->tail != NULL)
f->tail->next = cell; f->tail->next = cell;
f->tail = cell; f->tail = cell;
if (f->head == NULL) if (f->head == NULL)
f->head = cell; f->head = cell;
cell->next = NULL; cell->next = NULL;
f->cells++; f->cells++;
spin_unlock_irqrestore(&f->lock, flags); }
/* wakeup client */ /* wakeup client */
if (waitqueue_active(&f->input_sleep)) if (waitqueue_active(&f->input_sleep))
...@@ -199,16 +197,13 @@ int snd_seq_fifo_cell_out(struct snd_seq_fifo *f, ...@@ -199,16 +197,13 @@ int snd_seq_fifo_cell_out(struct snd_seq_fifo *f,
void snd_seq_fifo_cell_putback(struct snd_seq_fifo *f, void snd_seq_fifo_cell_putback(struct snd_seq_fifo *f,
struct snd_seq_event_cell *cell) struct snd_seq_event_cell *cell)
{ {
unsigned long flags;
if (cell) { if (cell) {
spin_lock_irqsave(&f->lock, flags); guard(spinlock_irqsave)(&f->lock);
cell->next = f->head; cell->next = f->head;
f->head = cell; f->head = cell;
if (!f->tail) if (!f->tail)
f->tail = cell; f->tail = cell;
f->cells++; f->cells++;
spin_unlock_irqrestore(&f->lock, flags);
} }
} }
...@@ -239,17 +234,17 @@ int snd_seq_fifo_resize(struct snd_seq_fifo *f, int poolsize) ...@@ -239,17 +234,17 @@ int snd_seq_fifo_resize(struct snd_seq_fifo *f, int poolsize)
return -ENOMEM; return -ENOMEM;
} }
spin_lock_irq(&f->lock); scoped_guard(spinlock_irq, &f->lock) {
/* remember old pool */ /* remember old pool */
oldpool = f->pool; oldpool = f->pool;
oldhead = f->head; oldhead = f->head;
/* exchange pools */ /* exchange pools */
f->pool = newpool; f->pool = newpool;
f->head = NULL; f->head = NULL;
f->tail = NULL; f->tail = NULL;
f->cells = 0; f->cells = 0;
/* NOTE: overflow flag is not cleared */ /* NOTE: overflow flag is not cleared */
spin_unlock_irq(&f->lock); }
/* close the old pool and wait until all users are gone */ /* close the old pool and wait until all users are gone */
snd_seq_pool_mark_closing(oldpool); snd_seq_pool_mark_closing(oldpool);
...@@ -268,16 +263,14 @@ int snd_seq_fifo_resize(struct snd_seq_fifo *f, int poolsize) ...@@ -268,16 +263,14 @@ int snd_seq_fifo_resize(struct snd_seq_fifo *f, int poolsize)
/* get the number of unused cells safely */ /* get the number of unused cells safely */
int snd_seq_fifo_unused_cells(struct snd_seq_fifo *f) int snd_seq_fifo_unused_cells(struct snd_seq_fifo *f)
{ {
unsigned long flags;
int cells; int cells;
if (!f) if (!f)
return 0; return 0;
snd_use_lock_use(&f->use_lock); snd_use_lock_use(&f->use_lock);
spin_lock_irqsave(&f->lock, flags); scoped_guard(spinlock_irqsave, &f->lock)
cells = snd_seq_unused_cells(f->pool); cells = snd_seq_unused_cells(f->pool);
spin_unlock_irqrestore(&f->lock, flags);
snd_use_lock_free(&f->use_lock); snd_use_lock_free(&f->use_lock);
return cells; return cells;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment