Commit 45bab301 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: seq: midi: 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-18-tiwai@suse.de
parent aa75a222
Loading
Loading
Loading
Loading
+4 −12
Original line number Diff line number Diff line
@@ -302,22 +302,19 @@ snd_seq_midisynth_probe(struct device *_dev)
	if (ports > (256 / SNDRV_RAWMIDI_DEVICES))
		ports = 256 / SNDRV_RAWMIDI_DEVICES;

	mutex_lock(&register_mutex);
	guard(mutex)(&register_mutex);
	client = synths[card->number];
	if (client == NULL) {
		newclient = 1;
		client = kzalloc(sizeof(*client), GFP_KERNEL);
		if (client == NULL) {
			mutex_unlock(&register_mutex);
		if (client == NULL)
			return -ENOMEM;
		}
		client->seq_client =
			snd_seq_create_kernel_client(
				card, 0, "%s", card->shortname[0] ?
				(const char *)card->shortname : "External MIDI");
		if (client->seq_client < 0) {
			kfree(client);
			mutex_unlock(&register_mutex);
			return -ENOMEM;
		}
	}
@@ -398,7 +395,6 @@ snd_seq_midisynth_probe(struct device *_dev)
	client->num_ports++;
	if (newclient)
		synths[card->number] = client;
	mutex_unlock(&register_mutex);
	return 0;	/* success */

      __nomem:
@@ -411,7 +407,6 @@ snd_seq_midisynth_probe(struct device *_dev)
		snd_seq_delete_kernel_client(client->seq_client);
		kfree(client);
	}
	mutex_unlock(&register_mutex);
	return -ENOMEM;
}

@@ -425,12 +420,10 @@ snd_seq_midisynth_remove(struct device *_dev)
	struct snd_card *card = dev->card;
	int device = dev->device, p, ports;
	
	mutex_lock(&register_mutex);
	guard(mutex)(&register_mutex);
	client = synths[card->number];
	if (client == NULL || client->ports[device] == NULL) {
		mutex_unlock(&register_mutex);
	if (client == NULL || client->ports[device] == NULL)
		return -ENODEV;
	}
	ports = client->ports_per_device[device];
	client->ports_per_device[device] = 0;
	msynth = client->ports[device];
@@ -444,7 +437,6 @@ snd_seq_midisynth_remove(struct device *_dev)
		synths[card->number] = NULL;
		kfree(client);
	}
	mutex_unlock(&register_mutex);
	return 0;
}

+3 −11
Original line number Diff line number Diff line
@@ -144,21 +144,15 @@ static inline void reset_encode(struct snd_midi_event *dev)

void snd_midi_event_reset_encode(struct snd_midi_event *dev)
{
	unsigned long flags;

	spin_lock_irqsave(&dev->lock, flags);
	guard(spinlock_irqsave)(&dev->lock);
	reset_encode(dev);
	spin_unlock_irqrestore(&dev->lock, flags);
}
EXPORT_SYMBOL(snd_midi_event_reset_encode);

void snd_midi_event_reset_decode(struct snd_midi_event *dev)
{
	unsigned long flags;

	spin_lock_irqsave(&dev->lock, flags);
	guard(spinlock_irqsave)(&dev->lock);
	dev->lastcmd = 0xff;
	spin_unlock_irqrestore(&dev->lock, flags);
}
EXPORT_SYMBOL(snd_midi_event_reset_decode);

@@ -177,7 +171,6 @@ bool snd_midi_event_encode_byte(struct snd_midi_event *dev, unsigned char c,
				struct snd_seq_event *ev)
{
	bool rc = false;
	unsigned long flags;

	if (c >= MIDI_CMD_COMMON_CLOCK) {
		/* real-time event */
@@ -187,7 +180,7 @@ bool snd_midi_event_encode_byte(struct snd_midi_event *dev, unsigned char c,
		return ev->type != SNDRV_SEQ_EVENT_NONE;
	}

	spin_lock_irqsave(&dev->lock, flags);
	guard(spinlock_irqsave)(&dev->lock);
	if ((c & 0x80) &&
	    (c != MIDI_CMD_COMMON_SYSEX_END || dev->type != ST_SYSEX)) {
		/* new command */
@@ -236,7 +229,6 @@ bool snd_midi_event_encode_byte(struct snd_midi_event *dev, unsigned char c,
		}
	}

	spin_unlock_irqrestore(&dev->lock, flags);
	return rc;
}
EXPORT_SYMBOL(snd_midi_event_encode_byte);