//#define LOCK_INC ((unsigned int)2) // case 1 This works because it is casting to unsigned int. If you change it to unsigned short int, it becomes consistent with case 2.
On Tue, May 5, 2015 at 8:25 AM, Raghavendra K T <raghavendra...@linux.vnet.ibm.com> wrote: > On 05/05/2015 07:33 PM, Tahsin Erdogan wrote: >> >> The conversion to signed happens with types shorter than int (__ticket_t >> is either u8 or u16). >> >> By changing Raghavendra's program to use unsigned short int, you can see >> the problem: >> >> ================ >> #include <stdio.h> >> >> #define LOCK_INC 2 >> >> int main() >> { >> unsigned short int head = 32700, tail=2; >> >> if ((tail - head) > LOCK_INC) >> printf(" tail - head > LOCK_INC \n"); >> else >> printf(" tail - head < LOCK_INC \n"); >> >> return 0; >> } >> >> ================ >> gcc -g -o t main.c >> ./t >> tail - head < LOCK_INC >> >> However, having just unsigned int returns the opposite result (unsigned >> int head = 32700, tail=2;) >> > > Interestingly, > > #include <stdio.h> > > //#define LOCK_INC ((unsigned int)2) // case 1 > #define LOCK_INC 2 //case 2 > > int main() > { > unsigned short int head = 32700, tail=2; > > if ((tail - head) > LOCK_INC) > printf(" tail - head > LOCK_INC \n"); > else > printf(" tail - head < LOCK_INC \n"); > > return 0; > } > > case 1 works here (PeterZ's stricter version) > > case 2 gives tail - head < LOCK_INC > > But is it not that we have case 1 we are looking here ? > > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/