On Sat, 5 May 2007, Esben Nielsen wrote: > > I have been wondering why you use usigned for timers anyway. It is also like > that in hrtimers. Why not use signed and avoid (almost) all worries about wrap > around issues. The trick is that when all > a < b > is be replaced by > a - b < 0 > the code will work on all 2-complement machines even if the (signed!) integers > a and b wrap around.
No. BOTH of the above are buggy. The C language definition doesn't allow signed integers to wrap (ie it's undefined behaviour), so "a-b < 0" can be rewritten by the compiler as a simple signed "a < b". And the unsigned (or signed) "a < b" is just broken wrt any kind of wrap-around (whether wrapping around zero or the sign bit). So the _only_ valid way to handle timers is to - either not allow wrapping at all (in which case "unsigned" is better, since it is bigger) - or use wrapping explicitly, and use unsigned arithmetic (which is well-defined in C) and do something like "(long)(a-b) > 0". Notice? The signed variant is basically _never_ correct. Linus - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/