#endif
 
 
-#define LW_FLAG_HAS_WAITERS            ((uint32) 1 << 30)
-#define LW_FLAG_RELEASE_OK         ((uint32) 1 << 29)
-#define LW_FLAG_LOCKED             ((uint32) 1 << 28)
-
-#define LW_VAL_EXCLUSIVE           ((uint32) 1 << 24)
+#define LW_FLAG_HAS_WAITERS            ((uint32) 1 << 31)
+#define LW_FLAG_RELEASE_OK         ((uint32) 1 << 30)
+#define LW_FLAG_LOCKED             ((uint32) 1 << 29)
+#define LW_FLAG_BITS               3
+#define LW_FLAG_MASK               (((1<<LW_FLAG_BITS)-1)<<(32-LW_FLAG_BITS))
+
+/* assumes MAX_BACKENDS is a (power of 2) - 1, checked below */
+#define LW_VAL_EXCLUSIVE           (MAX_BACKENDS + 1)
 #define LW_VAL_SHARED              1
 
-#define LW_LOCK_MASK               ((uint32) ((1 << 25)-1))
-/* Must be greater than MAX_BACKENDS - which is 2^23-1, so we're fine. */
-#define LW_SHARED_MASK             ((uint32) ((1 << 24)-1))
+/* already (power of 2)-1, i.e. suitable for a mask */
+#define LW_SHARED_MASK             MAX_BACKENDS
+#define LW_LOCK_MASK               (MAX_BACKENDS | LW_VAL_EXCLUSIVE)
+
+
+StaticAssertDecl(((MAX_BACKENDS + 1) & MAX_BACKENDS) == 0,
+                "MAX_BACKENDS + 1 needs to be a power of 2");
+
+StaticAssertDecl((MAX_BACKENDS & LW_FLAG_MASK) == 0,
+                "MAX_BACKENDS and LW_FLAG_MASK overlap");
 
-StaticAssertDecl(LW_VAL_EXCLUSIVE > (uint32) MAX_BACKENDS,
-                "MAX_BACKENDS too big for lwlock.c");
+StaticAssertDecl((LW_VAL_EXCLUSIVE & LW_FLAG_MASK) == 0,
+                "LW_VAL_EXCLUSIVE and LW_FLAG_MASK overlap");
 
 /*
  * There are three sorts of LWLock "tranches":