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