Update of /cvsroot/alsa/alsa-kernel/core
In directory sc8-pr-cvs1:/tmp/cvs-serv13789/core
Modified Files:
timer.c
Log Message:
Implemented exclusive timer access.
Index: timer.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/core/timer.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- timer.c 2 Mar 2003 16:58:37 -0000 1.35
+++ timer.c 2 Mar 2003 19:13:02 -0000 1.36
@@ -233,8 +233,9 @@
* open a timer instance
* when opening a master, the slave id must be here given.
*/
-snd_timer_instance_t *snd_timer_open(char *owner, snd_timer_id_t *tid,
- unsigned int slave_id)
+int snd_timer_open(snd_timer_instance_t **ti,
+ char *owner, snd_timer_id_t *tid,
+ unsigned int slave_id)
{
snd_timer_t *timer;
snd_timer_instance_t *timeri = NULL;
@@ -244,7 +245,7 @@
if (tid->dev_sclass <= SNDRV_TIMER_SCLASS_NONE ||
tid->dev_sclass > SNDRV_TIMER_SCLASS_OSS_SEQUENCER) {
snd_printd("invalid slave class %i\n", tid->dev_sclass);
- return NULL;
+ return -EINVAL;
}
down(®ister_mutex);
timeri = snd_timer_instance_new(owner, NULL);
@@ -254,7 +255,8 @@
list_add_tail(&timeri->open_list, &snd_timer_slave_list);
snd_timer_check_slave(timeri);
up(®ister_mutex);
- return timeri;
+ *ti = timeri;
+ return 0;
}
/* open a master instance */
@@ -269,6 +271,13 @@
}
#endif
if (timer) {
+ if (!list_empty(&timer->open_list_head)) {
+ timeri = (snd_timer_instance_t *)timer->open_list_head.next;
+ if (timeri->flags & SNDRV_TIMER_IFLG_EXCLUSIVE) {
+ up(®ister_mutex);
+ return -EBUSY;
+ }
+ }
timeri = snd_timer_instance_new(owner, timer);
if (timeri) {
timeri->slave_class = tid->dev_sclass;
@@ -278,9 +287,13 @@
list_add_tail(&timeri->open_list, &timer->open_list_head);
snd_timer_check_master(timeri);
}
+ } else {
+ up(®ister_mutex);
+ return -ENODEV;
}
up(®ister_mutex);
- return timeri;
+ *ti = timeri;
+ return 0;
}
static int _snd_timer_stop(snd_timer_instance_t * timeri, int keep_flag, enum
sndrv_timer_event event);
@@ -1316,7 +1329,7 @@
ginfo.clients++;
}
} else {
- err = -ENOENT;
+ err = -ENODEV;
}
up(®ister_mutex);
if (err >= 0 && copy_to_user(_ginfo, &ginfo, sizeof(ginfo)))
@@ -1344,7 +1357,7 @@
err = -EBUSY;
}
} else {
- err = -ENOENT;
+ err = -ENODEV;
}
up(®ister_mutex);
return err;
@@ -1376,7 +1389,7 @@
gstatus.resolution_den = gstatus.resolution;
}
} else {
- err = -ENOENT;
+ err = -ENODEV;
}
up(®ister_mutex);
if (err >= 0 && copy_from_user(_gstatus, &gstatus, sizeof(gstatus)))
@@ -1389,6 +1402,7 @@
snd_timer_user_t *tu;
snd_timer_select_t tselect;
char str[32];
+ int err;
tu = snd_magic_cast(snd_timer_user_t, file->private_data, return -ENXIO);
if (tu->timeri)
@@ -1398,8 +1412,8 @@
sprintf(str, "application %i", current->pid);
if (tselect.id.dev_class != SNDRV_TIMER_CLASS_SLAVE)
tselect.id.dev_sclass = SNDRV_TIMER_SCLASS_APPLICATION;
- if ((tu->timeri = snd_timer_open(str, &tselect.id, current->pid)) == NULL)
- return -ENODEV;
+ if ((err = snd_timer_open(&tu->timeri, str, &tselect.id, current->pid)) < 0)
+ return err;
if (tu->queue) {
kfree(tu->queue);
@@ -1496,6 +1510,11 @@
tu->timeri->flags |= SNDRV_TIMER_IFLG_AUTO;
} else {
tu->timeri->flags &= ~SNDRV_TIMER_IFLG_AUTO;
+ }
+ if (params.flags & SNDRV_TIMER_PSFLG_EXCLUSIVE) {
+ tu->timeri->flags |= SNDRV_TIMER_IFLG_EXCLUSIVE;
+ } else {
+ tu->timeri->flags &= ~SNDRV_TIMER_IFLG_EXCLUSIVE;
}
spin_unlock_irqrestore(&t->lock, flags);
if (params.queue_size > 0 && (unsigned int)tu->queue_size !=
params.queue_size) {
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog