From: Mathieu Desnoyers Date: Mon, 9 Feb 2009 18:48:38 +0000 (-0500) Subject: Fix RCU_GP_CTR_BIT X-Git-Tag: v0.1~301 X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=commitdiff_plain;h=6e32665beaad7fef48e9ab3c8c4cda2e9c232dde Fix RCU_GP_CTR_BIT > > You lost me on this one: > > > > sizeof(long) << 2 = 0x10 > > > > I could believe the following (run on a 32-bit machine): > > > > 1 << (sizeof(long) * 8 - 1) = 0x80000000 > > > > Or, if you were wanting to use a bit halfway up the word, perhaps this: > > > > 1 << (sizeof(long) * 4 - 1) = 0x8000 > > > > Or am I confused? > > Well, I am at least partly confused. You were wanting a low-order bit, > so you want to lose the "- 1" above. Here are some of the possibilities: > > sizeof(long) = 0x4 > sizeof(long) << 2 = 0x10 > 1 << (sizeof(long) * 8 - 1) = 0x80000000 > 1 << (sizeof(long) * 4) = 0x10000 > 1 << (sizeof(long) * 4 - 1) = 0x8000 > 1 << (sizeof(long) * 2) = 0x100 > 1 << (sizeof(long) * 2 - 1) = 0x80 > > My guess is that 1 << (sizeof(long) * 4) and 1 << (sizeof(long) * 2) > are of the most interest. > Exactly. I'll change it to : I somehow thought this define was used as a bit number rather than the bit mask. Signed-off-by: Mathieu Desnoyers --- diff --git a/urcu.h b/urcu.h index 4249806..444d9cd 100644 --- a/urcu.h +++ b/urcu.h @@ -165,9 +165,9 @@ static inline void debug_yield_init(void) * The trick here is that RCU_GP_CTR_BIT must be a multiple of 8 so we can use a * full 8-bits, 16-bits or 32-bits bitmask for the lower order bits. */ -#define RCU_GP_COUNT (1U << 0) +#define RCU_GP_COUNT (1UL << 0) /* Use the amount of bits equal to half of the architecture long size */ -#define RCU_GP_CTR_BIT (sizeof(long) << 2) +#define RCU_GP_CTR_BIT (1UL << (sizeof(long) << 2)) #define RCU_GP_CTR_NEST_MASK (RCU_GP_CTR_BIT - 1) /*