Messages in this thread |  | | Date | Thu, 20 Sep 2001 17:03:49 +0300 | From | Ville Herva <> | Subject | Re: Fw: Re: [PATCH] fix page aging (2.4.9-ac12) |
| |
On Thu, Sep 20, 2001 at 03:48:06PM +0200, you [Stephan von Krawczynski] claimed: > On Thu, 20 Sep 2001 15:32:26 +0200 Daniel Phillips <phillips@bonn-fries.net> > wrote: > > > static inline void age_page_down(struct page *page) > > { > > page->age = max((int) (age - PAGE_AGE_DECL), 0); > > } > > Aehm, Daniel. Just for a hint of what I know about C: > > IF age is unsigned long (like declared above) and PAGE_AGE_DECL is a define, > then age-PAGE_AGE_DECL is of type unsigned long, which means it will not go > below 0 but instead be huge positive, so your cast (int) before will not do any > good, and you will not end up with 0 but somewhere above the clouds. > So you just made Linus' max/min/cast point of view _very_ clear, I guess it was > something like "people don't really think about using max/min and related > problems".
age - PAGE_AGE_DECL may be a 2^32-1 or so, but when you cast it back to int, it is at most 2^31 again. It rolls over, so you get the sign bit back. Witness:
vherva@linux:/home/vherva>cat n.c #define FOUR 4 void main() { unsigned three = 3; printf("%u\n", three - FOUR); printf("%i\n", (int)(three - FOUR)); printf("%i\n", (int)three - (int)FOUR); }
vherva@linux:/home/vherva>./a.out 4294967295 -1 -1
Perhaps a lucky incidence, but it works as Daniel wrote it. (At least on 32-bit architecture.)
I agree that Rik's variant is much more readable.
-- v --
v@iki.fi - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |