Update of /cvsroot/alsa/alsa-kernel/core
In directory sc8-pr-cvs1:/tmp/cvs-serv23630
Modified Files:
timer.c
Log Message:
An attempt to fix the system timer behaviour (lost jiffy ticks)
Index: timer.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/core/timer.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -r1.52 -r1.53
--- timer.c 23 Oct 2003 14:34:52 -0000 1.52
+++ timer.c 16 Dec 2003 10:02:46 -0000 1.53
@@ -935,6 +935,14 @@
* System timer
*/
+struct snd_timer_system_private {
+ struct timer_list tlist;
+ struct timer * timer;
+ unsigned long last_expires;
+ unsigned long last_jiffies;
+ unsigned long correction;
+};
+
unsigned int snd_timer_system_resolution(void)
{
return 1000000000L / HZ;
@@ -943,26 +951,44 @@
static void snd_timer_s_function(unsigned long data)
{
snd_timer_t *timer = (snd_timer_t *)data;
+ struct snd_timer_system_private *priv = timer->private_data;
+ unsigned long jiff = jiffies;
+ if (time_after(jiff, priv->last_expires))
+ priv->correction = (long)jiff - (long)priv->last_expires;
snd_timer_interrupt(timer, timer->sticks);
}
static int snd_timer_s_start(snd_timer_t * timer)
{
- struct timer_list *tlist;
+ struct snd_timer_system_private *priv;
+ unsigned long njiff;
- tlist = (struct timer_list *) timer->private_data;
- tlist->expires = jiffies + timer->sticks;
- add_timer(tlist);
+ priv = (struct snd_timer_system_private *) timer->private_data;
+ njiff = (priv->last_jiffies = jiffies);
+ if (priv->correction > timer->sticks - 1) {
+ priv->correction -= timer->sticks - 1;
+ njiff++;
+ } else {
+ njiff += timer->sticks - priv->correction;
+ priv->correction -= timer->sticks;
+ }
+ priv->last_expires = priv->tlist.expires = njiff;
+ add_timer(&priv->tlist);
return 0;
}
static int snd_timer_s_stop(snd_timer_t * timer)
{
- struct timer_list *tlist;
+ struct snd_timer_system_private *priv;
+ unsigned long jiff;
- tlist = (struct timer_list *) timer->private_data;
- del_timer(tlist);
- timer->sticks = tlist->expires - jiffies;
+ priv = (struct snd_timer_system_private *) timer->private_data;
+ del_timer(&priv->tlist);
+ jiff = jiffies;
+ if (time_before(jiff, priv->last_expires))
+ timer->sticks = priv->last_expires - jiff;
+ else
+ timer->sticks = 1;
return 0;
}
@@ -984,22 +1010,22 @@
static int snd_timer_register_system(void)
{
snd_timer_t *timer;
- struct timer_list *tlist;
+ struct snd_timer_system_private *priv;
int err;
if ((err = snd_timer_global_new("system", SNDRV_TIMER_GLOBAL_SYSTEM, &timer))
< 0)
return err;
strcpy(timer->name, "system timer");
timer->hw = snd_timer_system;
- tlist = (struct timer_list *) snd_kcalloc(sizeof(struct timer_list),
GFP_KERNEL);
- if (tlist == NULL) {
+ priv = (struct snd_timer_system_private *) snd_kcalloc(sizeof(struct
snd_timer_system_private), GFP_KERNEL);
+ if (priv == NULL) {
snd_timer_free(timer);
return -ENOMEM;
}
- init_timer(tlist);
- tlist->function = snd_timer_s_function;
- tlist->data = (unsigned long) timer;
- timer->private_data = tlist;
+ init_timer(&priv->tlist);
+ priv->tlist.function = snd_timer_s_function;
+ priv->tlist.data = (unsigned long) priv;
+ timer->private_data = timer;
timer->private_free = snd_timer_free_system;
return snd_timer_global_register(timer);
}
-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive? Does it
help you create better code? SHARE THE LOVE, and help us help
YOU! Click Here: http://sourceforge.net/donate/
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog