dix: Make small bitfields that store enums unsigned
Commit 31bf81772e
changed the clientState field
from a signed int to a signed int 2-bit bitfield. The ClientState enum that is
expected to be assigned to this field has four values: ClientStateInitial (0),
ClientStateRunning (1), ClientStateRetained (2), and ClientStateGone (3).
However, because this bitfield is signed, ClientStateRetained becomes -2 when
assigned, and ClientStateGone becomes -1. This causes warnings:
test.c:54:10: error: case label value exceeds maximum value for type [-Werror]
test.c:55:10: error: case label value exceeds maximum value for type [-Werror]
The code here is a switch statement:
53 switch (client->clientState) {
54 case ClientStateGone:
55 case ClientStateRetained:
56 [...]
57 break;
58
59 default:
60 [...]
61 break;
62 }
It also causes bizarre problems like this:
client->clientState = ClientStateGone;
assert(client->clientState == ClientStateGone); // this assert fails
Also change the signedness of nearby bitfields to match.
Signed-off-by: Aaron Plattner <aplattner@nvidia.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Colin Harrison <colin.harrison at virgin.net>
Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
bd91b05b63
commit
8b328d4ee3
|
@ -90,12 +90,12 @@ typedef struct _Client {
|
|||
Mask clientAsMask;
|
||||
short index;
|
||||
unsigned char majorOp, minorOp;
|
||||
int swapped:1;
|
||||
int local:1;
|
||||
int big_requests:1; /* supports large requests */
|
||||
int clientGone:1;
|
||||
int closeDownMode:2;
|
||||
int clientState:2;
|
||||
unsigned int swapped:1;
|
||||
unsigned int local:1;
|
||||
unsigned int big_requests:1; /* supports large requests */
|
||||
unsigned int clientGone:1;
|
||||
unsigned int closeDownMode:2;
|
||||
unsigned int clientState:2;
|
||||
char smart_priority;
|
||||
short noClientException; /* this client died or needs to be killed */
|
||||
int priority;
|
||||
|
|
Loading…
Reference in New Issue
Block a user