diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2010-03-08 12:41:25 -0800 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2010-03-29 10:02:51 -0700 |
commit | b00d435ddf2e9817e33bfd5f7e9b905442dc23c7 (patch) | |
tree | 436f3cfd060fe94d16862dd0bb24dc4a66f6beb2 | |
parent | 0294ff2a5cadddc8fcc77ba9a851f979f0b91fc3 (diff) |
DRI2: handle swapsPending better
Avoid a potential swapsPending underflow by incrementing it before
ScheduleSwap, which may complete it immediately. And be sure to
decrement it again in case the schedule failed.
Reported-by: Mario Kleiner <mario.kleiner@tuebingen.mpg.de>
Reviewed-by: Mario Kleiner <mario.kleiner@tuebingen.mpg.de>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
-rw-r--r-- | hw/xfree86/dri2/dri2.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c index 3fc7f4ee2..8a671226f 100644 --- a/hw/xfree86/dri2/dri2.c +++ b/hw/xfree86/dri2/dri2.c @@ -654,15 +654,16 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc, *swap_target = target_msc; } + pPriv->swapsPending++; ret = (*ds->ScheduleSwap)(client, pDraw, pDestBuffer, pSrcBuffer, swap_target, divisor, remainder, func, data); if (!ret) { + pPriv->swapsPending--; /* didn't schedule */ xf86DrvMsg(pScreen->myNum, X_ERROR, "[DRI2] %s: driver failed to schedule swap\n", __func__); return BadDrawable; } - pPriv->swapsPending++; pPriv->last_swap_target = *swap_target; /* According to spec, return expected swapbuffers count SBC after this swap |