/*
* lock access to sflist
*/
-static int
-lock_preset(snd_sf_list_t *sflist, int nonblock)
+static void
+lock_preset(snd_sf_list_t *sflist)
{
- if (nonblock) {
- if (down_trylock(&sflist->presets_mutex))
- return -EBUSY;
- } else
- down(&sflist->presets_mutex);
- return 0;
+ unsigned long flags;
+ down(&sflist->presets_mutex);
+ spin_lock_irqsave(&sflist->lock, flags);
+ sflist->presets_locked = 1;
+ spin_unlock_irqrestore(&sflist->lock, flags);
}
static void
unlock_preset(snd_sf_list_t *sflist)
{
+ unsigned long flags;
+ spin_lock_irqsave(&sflist->lock, flags);
+ sflist->presets_locked = 0;
+ spin_unlock_irqrestore(&sflist->lock, flags);
up(&sflist->presets_mutex);
}
if (patch.type == SNDRV_SFNT_OPEN_PATCH) {
/* grab sflist to open */
- lock_preset(sflist, 0);
+ lock_preset(sflist);
rc = open_patch(sflist, data, count, client);
unlock_preset(sflist);
return rc;
}
spin_unlock_irqrestore(&sflist->lock, flags);
- lock_preset(sflist, 0);
+ lock_preset(sflist);
rc = -EINVAL;
switch (patch.type) {
case SNDRV_SFNT_LOAD_INFO:
return -ENOMEM;
}
+ spin_lock_irqsave(&sflist->lock, flags);
sflist->open_client = client;
sflist->currsf = sf;
+ spin_unlock_irqrestore(&sflist->lock, flags);
return 0;
}
}
/* not found -- create a new one */
- sf = (snd_soundfont_t*)snd_kcalloc(sizeof(*sf), GFP_KERNEL);
+ sf = kcalloc(1, sizeof(*sf), GFP_KERNEL);
if (sf == NULL)
return NULL;
sf->id = sflist->fonts_size;
static int
close_patch(snd_sf_list_t *sflist)
{
+ unsigned long flags;
+
+ spin_lock_irqsave(&sflist->lock, flags);
sflist->currsf = NULL;
sflist->open_client = -1;
+ spin_unlock_irqrestore(&sflist->lock, flags);
rebuild_presets(sflist);
{
snd_sf_zone_t *zp;
- if ((zp = snd_kcalloc(sizeof(*zp), GFP_KERNEL)) == NULL)
+ if ((zp = kcalloc(1, sizeof(*zp), GFP_KERNEL)) == NULL)
return NULL;
zp->next = sf->zones;
sf->zones = zp;
{
snd_sf_sample_t *sp;
- if ((sp = snd_kcalloc(sizeof(*sp), GFP_KERNEL)) == NULL)
+ if ((sp = kcalloc(1, sizeof(*sp), GFP_KERNEL)) == NULL)
return NULL;
sp->next = sf->samples;
long count, int client)
{
int rc;
- lock_preset(sflist, 0);
+ lock_preset(sflist);
rc = load_guspatch(sflist, data, count, client);
unlock_preset(sflist);
return rc;
snd_sf_zone_t **table, int max_layers)
{
int nvoices;
+ unsigned long flags;
- if (lock_preset(sflist, 1))
+ /* this function is supposed to be called atomically,
+ * so we check the lock. if it's busy, just returns 0 to
+ * tell the caller the busy state
+ */
+ spin_lock_irqsave(&sflist->lock, flags);
+ if (sflist->presets_locked) {
+ spin_unlock_irqrestore(&sflist->lock, flags);
return 0;
-
+ }
nvoices = search_zones(sflist, notep, vel, preset, bank, table, max_layers, 0);
if (! nvoices) {
if (preset != def_preset || bank != def_bank)
nvoices = search_zones(sflist, notep, vel, def_preset, def_bank, table, max_layers, 0);
}
- unlock_preset(sflist);
-
+ spin_unlock_irqrestore(&sflist->lock, flags);
return nvoices;
}
{
snd_sf_list_t *sflist;
- if ((sflist = snd_kcalloc(sizeof(snd_sf_list_t), GFP_KERNEL)) == NULL)
+ if ((sflist = kcalloc(1, sizeof(*sflist), GFP_KERNEL)) == NULL)
return NULL;
init_MUTEX(&sflist->presets_mutex);
if (sflist == NULL)
return;
- lock_preset(sflist, 0);
+ lock_preset(sflist);
if (sflist->callback.sample_reset)
sflist->callback.sample_reset(sflist->callback.private_data);
snd_sf_clear(sflist);
int
snd_soundfont_remove_samples(snd_sf_list_t *sflist)
{
- lock_preset(sflist, 0);
+ lock_preset(sflist);
if (sflist->callback.sample_reset)
sflist->callback.sample_reset(sflist->callback.private_data);
snd_sf_clear(sflist);
snd_sf_zone_t *zp, *nextzp;
snd_sf_sample_t *sp, *nextsp;
- if (lock_preset(sflist, 1))
- return -EBUSY;
+ lock_preset(sflist);
if (sflist->callback.sample_reset)
sflist->callback.sample_reset(sflist->callback.private_data);