diff options
| -rw-r--r-- | sys/src/games/doom/d_main.c | 18 |
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)) |
