ref: e64067a73ac9ae2154e01368f47924253a9b42c8
parent: de46bc97fadf289243db859bafec1d674ba7f51b
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Fri Jul 27 07:08:33 EDT 2012
doom: make sure not to drop keyup/keydown events
--- a/sys/src/games/doom/d_main.c
+++ b/sys/src/games/doom/d_main.c
@@ -130,6 +130,7 @@
event_t events[MAXEVENTS];
int eventhead;
int eventtail;
+QLock eventlock;
//
@@ -138,8 +139,21 @@
//
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 @@
&& (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))
--
⑨