summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-07-27 11:08:33 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-07-27 11:08:33 +0200
commitab08c97e6010309d4ea0df26815d074b1f5d1a4b (patch)
treeeb492d37eb82d113c431a9d098d95d156c631ada /sys
parent98b9c4eb1ef0907ee596cc2ddd19beb03427a062 (diff)
doom: make sure not to drop keyup/keydown events
Diffstat (limited to 'sys')
-rw-r--r--sys/src/games/doom/d_main.c18
1 files 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))