Messages in this thread | | | Date | Tue, 05 May 2015 20:55:25 +0530 | From | Raghavendra K T <> | Subject | Re: [PATCH] x86/spinlocks: Fix regression in spinlock contention detection |
| |
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 ?
| |