Looks good, I put it in.

Cheers,

 - Jim

On Fri, 2002-05-31 at 10:19, Timothy Stack wrote:
> 
> hi,
> 
> Attached is a fix for unix-jthreads that should better handle large
> timeout values.  For example:
> 
>   synchronized( this )
>   {
>     this.wait(Long.MAX_VALUE);
>   }
> 
> eventually reaches this code:
> 
>   jtid->time = timeout + currentTime();
> 
> which overflows and gives a bogus value.
> 
> tim
> ----
> 

> Index: jthread.c
> ===================================================================
> RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/systems/unix-jthreads/jthread.c,v
> retrieving revision 1.86
> diff -u -r1.86 jthread.c
> --- jthread.c 29 May 2002 19:46:24 -0000      1.86
> +++ jthread.c 31 May 2002 17:11:56 -0000
> @@ -255,26 +255,34 @@
>  addToAlarmQ(jthread* jtid, jlong timeout)
>  {
>       jthread** tidp;
> +     jlong ct;
>  
>       assert(intsDisabled());
>  
> -     jtid->flags |= THREAD_FLAGS_ALARM;
> -
> -     /* Get absolute time */
> -     jtid->time = timeout + currentTime();
> -
> -     /* Find place in alarm list and insert it */
> -     for (tidp = &alarmList; (*tidp) != 0; tidp = &(*tidp)->nextalarm) {
> -             if ((*tidp)->time > jtid->time) {
> -                     break;
> +     ct = currentTime();
> +     if( (timeout + ct) > ct ) {
> +             jtid->flags |= THREAD_FLAGS_ALARM;
> +             
> +             /* Get absolute time */
> +             jtid->time = timeout + ct;
> +             
> +             /* Find place in alarm list and insert it */
> +             for (tidp = &alarmList;
> +                  (*tidp) != 0;
> +                  tidp = &(*tidp)->nextalarm) {
> +                     if ((*tidp)->time > jtid->time) {
> +                             break;
> +                     }
>               }
> -     }
> -     jtid->nextalarm = *tidp;
> -     *tidp = jtid;
> -
> -     /* If I'm head of alarm list, restart alarm */
> -     if (tidp == &alarmList) {
> -             MALARM(timeout);
> +             jtid->nextalarm = *tidp;
> +             *tidp = jtid;
> +             
> +             /* If I'm head of alarm list, restart alarm */
> +             if (tidp == &alarmList) {
> +                     MALARM(timeout);
> +             }
> +     } else {
> +             /* Huge timeout value, ignore it. */
>       }
>  }
>  
> @@ -2216,8 +2224,13 @@
>   * various building blocks for timeout system call functions
>   */
>  #define SET_DEADLINE(deadline, timeout)              \
> -     if (timeout != NOTIMEOUT) {                     \
> -             deadline = timeout + currentTime();     \
> +     if (timeout != NOTIMEOUT) {                     \
> +             jlong ct = currentTime();               \
> +             deadline = timeout + ct;                \
> +             if( deadline < ct ) {                   \
> +                     deadline = 0;                   \
> +                     timeout = NOTIMEOUT;            \
> +             }                                       \
>       }
>  
>  #define BREAK_IF_LATE(deadline, timeout)             \



_______________________________________________
kaffe mailing list
[EMAIL PROTECTED]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to