diff options
Diffstat (limited to 'firmware/kernel.c')
-rw-r--r-- | firmware/kernel.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/firmware/kernel.c b/firmware/kernel.c index 6da8a1b057..2b4b09f52b 100644 --- a/firmware/kernel.c +++ b/firmware/kernel.c | |||
@@ -102,6 +102,25 @@ void queue_wait(struct event_queue *q, struct event *ev) | |||
102 | *ev = q->events[(q->read++) & QUEUE_LENGTH_MASK]; | 102 | *ev = q->events[(q->read++) & QUEUE_LENGTH_MASK]; |
103 | } | 103 | } |
104 | 104 | ||
105 | void queue_wait_w_tmo(struct event_queue *q, struct event *ev, int ticks) | ||
106 | { | ||
107 | unsigned int timeout = current_tick + ticks; | ||
108 | |||
109 | while(q->read == q->write && TIME_BEFORE( current_tick, timeout )) | ||
110 | { | ||
111 | switch_thread(); | ||
112 | } | ||
113 | |||
114 | if(q->read != q->write) | ||
115 | { | ||
116 | *ev = q->events[(q->read++) & QUEUE_LENGTH_MASK]; | ||
117 | } | ||
118 | else | ||
119 | { | ||
120 | ev->id = SYS_TIMEOUT; | ||
121 | } | ||
122 | } | ||
123 | |||
105 | void queue_post(struct event_queue *q, int id, void *data) | 124 | void queue_post(struct event_queue *q, int id, void *data) |
106 | { | 125 | { |
107 | int wr; | 126 | int wr; |