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

Reply via email to