[PATCH] dix: Make small bitfields that store enums unsigned

Alex Deucher alexdeucher at gmail.com
Fri Dec 21 08:16:18 PST 2012


On Fri, Dec 21, 2012 at 10:37 AM, Aaron Plattner <aplattner at nvidia.com> wrote:
> Commit 31bf81772e146af79b0c456aae2159eba8b0280f 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.
>
> Cc: Adam Jackson <ajax at redhat.com>
> Signed-off-by: Aaron Plattner <aplattner at nvidia.com>

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  include/dixstruct.h | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/include/dixstruct.h b/include/dixstruct.h
> index c1236f5..6784819 100644
> --- a/include/dixstruct.h
> +++ b/include/dixstruct.h
> @@ -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;
> --
> 1.8.0.2
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel


More information about the xorg-devel mailing list