From ab08c97e6010309d4ea0df26815d074b1f5d1a4b Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Fri, 27 Jul 2012 11:08:33 +0200 Subject: doom: make sure not to drop keyup/keydown events --- sys/src/games/doom/d_main.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/sys/src/games/doom/d_main.c b/sys/src/games/doom/d_main.c index 490b659bc..2f6c87e06 100644 --- a/sys/src/games/doom/d_main.c +++ b/sys/src/games/doom/d_main.c @@ -130,6 +130,7 @@ void D_DoAdvanceDemo (void); event_t events[MAXEVENTS]; int eventhead; int eventtail; +QLock eventlock; // @@ -138,8 +139,21 @@ int eventtail; // void D_PostEvent (event_t* ev) { + int next; + +retry: + qlock(&eventlock); + next = (eventhead+1)&(MAXEVENTS-1); + if(next == eventtail){ + qunlock(&eventlock); + if(ev->type != ev_keydown && ev->type != ev_keyup) + return; + sleep(1); + goto retry; + } events[eventhead] = *ev; - eventhead = (++eventhead)&(MAXEVENTS-1); + eventhead = next; + qunlock(&eventlock); } @@ -156,7 +170,7 @@ void D_ProcessEvents (void) && (W_CheckNumForName("map01")<0) ) return; - for ( ; eventtail != eventhead ; eventtail = (++eventtail)&(MAXEVENTS-1) ) + for ( ; eventtail != eventhead ; eventtail = (eventtail+1)&(MAXEVENTS-1)) { ev = &events[eventtail]; if (M_Responder (ev)) -- cgit v1.2.3