My fork of the HTTPServer (working)

Dependents:   DGWWebServer LAN2

Committer:
screamer
Date:
Mon Aug 06 09:23:14 2012 +0000
Revision:
0:7a64fbb4069d
[mbed] converted /DGWWebServer/HTTPServer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:7a64fbb4069d 1 /**
screamer 0:7a64fbb4069d 2 * @file
screamer 0:7a64fbb4069d 3 * lwIP Operating System abstraction
screamer 0:7a64fbb4069d 4 *
screamer 0:7a64fbb4069d 5 */
screamer 0:7a64fbb4069d 6
screamer 0:7a64fbb4069d 7 /*
screamer 0:7a64fbb4069d 8 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
screamer 0:7a64fbb4069d 9 * All rights reserved.
screamer 0:7a64fbb4069d 10 *
screamer 0:7a64fbb4069d 11 * Redistribution and use in source and binary forms, with or without modification,
screamer 0:7a64fbb4069d 12 * are permitted provided that the following conditions are met:
screamer 0:7a64fbb4069d 13 *
screamer 0:7a64fbb4069d 14 * 1. Redistributions of source code must retain the above copyright notice,
screamer 0:7a64fbb4069d 15 * this list of conditions and the following disclaimer.
screamer 0:7a64fbb4069d 16 * 2. Redistributions in binary form must reproduce the above copyright notice,
screamer 0:7a64fbb4069d 17 * this list of conditions and the following disclaimer in the documentation
screamer 0:7a64fbb4069d 18 * and/or other materials provided with the distribution.
screamer 0:7a64fbb4069d 19 * 3. The name of the author may not be used to endorse or promote products
screamer 0:7a64fbb4069d 20 * derived from this software without specific prior written permission.
screamer 0:7a64fbb4069d 21 *
screamer 0:7a64fbb4069d 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
screamer 0:7a64fbb4069d 23 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
screamer 0:7a64fbb4069d 24 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
screamer 0:7a64fbb4069d 25 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
screamer 0:7a64fbb4069d 26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
screamer 0:7a64fbb4069d 27 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
screamer 0:7a64fbb4069d 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
screamer 0:7a64fbb4069d 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
screamer 0:7a64fbb4069d 30 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
screamer 0:7a64fbb4069d 31 * OF SUCH DAMAGE.
screamer 0:7a64fbb4069d 32 *
screamer 0:7a64fbb4069d 33 * This file is part of the lwIP TCP/IP stack.
screamer 0:7a64fbb4069d 34 *
screamer 0:7a64fbb4069d 35 * Author: Adam Dunkels <adam@sics.se>
screamer 0:7a64fbb4069d 36 *
screamer 0:7a64fbb4069d 37 */
screamer 0:7a64fbb4069d 38
screamer 0:7a64fbb4069d 39 #include "lwip/opt.h"
screamer 0:7a64fbb4069d 40
screamer 0:7a64fbb4069d 41 #if (NO_SYS == 0) /* don't build if not configured for use in lwipopts.h */
screamer 0:7a64fbb4069d 42
screamer 0:7a64fbb4069d 43 #include "lwip/sys.h"
screamer 0:7a64fbb4069d 44 #include "lwip/def.h"
screamer 0:7a64fbb4069d 45 #include "lwip/memp.h"
screamer 0:7a64fbb4069d 46 #include "lwip/tcpip.h"
screamer 0:7a64fbb4069d 47
screamer 0:7a64fbb4069d 48 /**
screamer 0:7a64fbb4069d 49 * Struct used for sys_sem_wait_timeout() to tell wether the time
screamer 0:7a64fbb4069d 50 * has run out or the semaphore has really become available.
screamer 0:7a64fbb4069d 51 */
screamer 0:7a64fbb4069d 52 struct sswt_cb
screamer 0:7a64fbb4069d 53 {
screamer 0:7a64fbb4069d 54 s16_t timeflag;
screamer 0:7a64fbb4069d 55 sys_sem_t *psem;
screamer 0:7a64fbb4069d 56 };
screamer 0:7a64fbb4069d 57
screamer 0:7a64fbb4069d 58 /**
screamer 0:7a64fbb4069d 59 * Wait (forever) for a message to arrive in an mbox.
screamer 0:7a64fbb4069d 60 * While waiting, timeouts (for this thread) are processed.
screamer 0:7a64fbb4069d 61 *
screamer 0:7a64fbb4069d 62 * @param mbox the mbox to fetch the message from
screamer 0:7a64fbb4069d 63 * @param msg the place to store the message
screamer 0:7a64fbb4069d 64 */
screamer 0:7a64fbb4069d 65 void
screamer 0:7a64fbb4069d 66 sys_mbox_fetch(sys_mbox_t mbox, void **msg)
screamer 0:7a64fbb4069d 67 {
screamer 0:7a64fbb4069d 68 u32_t time_needed;
screamer 0:7a64fbb4069d 69 struct sys_timeouts *timeouts;
screamer 0:7a64fbb4069d 70 struct sys_timeo *tmptimeout;
screamer 0:7a64fbb4069d 71 sys_timeout_handler h;
screamer 0:7a64fbb4069d 72 void *arg;
screamer 0:7a64fbb4069d 73
screamer 0:7a64fbb4069d 74 again:
screamer 0:7a64fbb4069d 75 timeouts = sys_arch_timeouts();
screamer 0:7a64fbb4069d 76
screamer 0:7a64fbb4069d 77 if (!timeouts || !timeouts->next) {
screamer 0:7a64fbb4069d 78 UNLOCK_TCPIP_CORE();
screamer 0:7a64fbb4069d 79 time_needed = sys_arch_mbox_fetch(mbox, msg, 0);
screamer 0:7a64fbb4069d 80 LOCK_TCPIP_CORE();
screamer 0:7a64fbb4069d 81 } else {
screamer 0:7a64fbb4069d 82 if (timeouts->next->time > 0) {
screamer 0:7a64fbb4069d 83 UNLOCK_TCPIP_CORE();
screamer 0:7a64fbb4069d 84 time_needed = sys_arch_mbox_fetch(mbox, msg, timeouts->next->time);
screamer 0:7a64fbb4069d 85 LOCK_TCPIP_CORE();
screamer 0:7a64fbb4069d 86 } else {
screamer 0:7a64fbb4069d 87 time_needed = SYS_ARCH_TIMEOUT;
screamer 0:7a64fbb4069d 88 }
screamer 0:7a64fbb4069d 89
screamer 0:7a64fbb4069d 90 if (time_needed == SYS_ARCH_TIMEOUT) {
screamer 0:7a64fbb4069d 91 /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
screamer 0:7a64fbb4069d 92 could be fetched. We should now call the timeout handler and
screamer 0:7a64fbb4069d 93 deallocate the memory allocated for the timeout. */
screamer 0:7a64fbb4069d 94 tmptimeout = timeouts->next;
screamer 0:7a64fbb4069d 95 timeouts->next = tmptimeout->next;
screamer 0:7a64fbb4069d 96 h = tmptimeout->h;
screamer 0:7a64fbb4069d 97 arg = tmptimeout->arg;
screamer 0:7a64fbb4069d 98 memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
screamer 0:7a64fbb4069d 99 if (h != NULL) {
screamer 0:7a64fbb4069d 100 LWIP_DEBUGF(SYS_DEBUG, ("smf calling h=%p(%p)\n", (void*)&h, arg));
screamer 0:7a64fbb4069d 101 h(arg);
screamer 0:7a64fbb4069d 102 }
screamer 0:7a64fbb4069d 103
screamer 0:7a64fbb4069d 104 /* We try again to fetch a message from the mbox. */
screamer 0:7a64fbb4069d 105 goto again;
screamer 0:7a64fbb4069d 106 } else {
screamer 0:7a64fbb4069d 107 /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout
screamer 0:7a64fbb4069d 108 occured. The time variable is set to the number of
screamer 0:7a64fbb4069d 109 milliseconds we waited for the message. */
screamer 0:7a64fbb4069d 110 if (time_needed < timeouts->next->time) {
screamer 0:7a64fbb4069d 111 timeouts->next->time -= time_needed;
screamer 0:7a64fbb4069d 112 } else {
screamer 0:7a64fbb4069d 113 timeouts->next->time = 0;
screamer 0:7a64fbb4069d 114 }
screamer 0:7a64fbb4069d 115 }
screamer 0:7a64fbb4069d 116 }
screamer 0:7a64fbb4069d 117 }
screamer 0:7a64fbb4069d 118
screamer 0:7a64fbb4069d 119 /**
screamer 0:7a64fbb4069d 120 * Wait (forever) for a semaphore to become available.
screamer 0:7a64fbb4069d 121 * While waiting, timeouts (for this thread) are processed.
screamer 0:7a64fbb4069d 122 *
screamer 0:7a64fbb4069d 123 * @param sem semaphore to wait for
screamer 0:7a64fbb4069d 124 */
screamer 0:7a64fbb4069d 125 void
screamer 0:7a64fbb4069d 126 sys_sem_wait(sys_sem_t sem)
screamer 0:7a64fbb4069d 127 {
screamer 0:7a64fbb4069d 128 u32_t time_needed;
screamer 0:7a64fbb4069d 129 struct sys_timeouts *timeouts;
screamer 0:7a64fbb4069d 130 struct sys_timeo *tmptimeout;
screamer 0:7a64fbb4069d 131 sys_timeout_handler h;
screamer 0:7a64fbb4069d 132 void *arg;
screamer 0:7a64fbb4069d 133
screamer 0:7a64fbb4069d 134 again:
screamer 0:7a64fbb4069d 135
screamer 0:7a64fbb4069d 136 timeouts = sys_arch_timeouts();
screamer 0:7a64fbb4069d 137
screamer 0:7a64fbb4069d 138 if (!timeouts || !timeouts->next) {
screamer 0:7a64fbb4069d 139 sys_arch_sem_wait(sem, 0);
screamer 0:7a64fbb4069d 140 } else {
screamer 0:7a64fbb4069d 141 if (timeouts->next->time > 0) {
screamer 0:7a64fbb4069d 142 time_needed = sys_arch_sem_wait(sem, timeouts->next->time);
screamer 0:7a64fbb4069d 143 } else {
screamer 0:7a64fbb4069d 144 time_needed = SYS_ARCH_TIMEOUT;
screamer 0:7a64fbb4069d 145 }
screamer 0:7a64fbb4069d 146
screamer 0:7a64fbb4069d 147 if (time_needed == SYS_ARCH_TIMEOUT) {
screamer 0:7a64fbb4069d 148 /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
screamer 0:7a64fbb4069d 149 could be fetched. We should now call the timeout handler and
screamer 0:7a64fbb4069d 150 deallocate the memory allocated for the timeout. */
screamer 0:7a64fbb4069d 151 tmptimeout = timeouts->next;
screamer 0:7a64fbb4069d 152 timeouts->next = tmptimeout->next;
screamer 0:7a64fbb4069d 153 h = tmptimeout->h;
screamer 0:7a64fbb4069d 154 arg = tmptimeout->arg;
screamer 0:7a64fbb4069d 155 memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
screamer 0:7a64fbb4069d 156 if (h != NULL) {
screamer 0:7a64fbb4069d 157 LWIP_DEBUGF(SYS_DEBUG, ("ssw h=%p(%p)\n", (void*)&h, (void *)arg));
screamer 0:7a64fbb4069d 158 h(arg);
screamer 0:7a64fbb4069d 159 }
screamer 0:7a64fbb4069d 160
screamer 0:7a64fbb4069d 161 /* We try again to fetch a message from the mbox. */
screamer 0:7a64fbb4069d 162 goto again;
screamer 0:7a64fbb4069d 163 } else {
screamer 0:7a64fbb4069d 164 /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout
screamer 0:7a64fbb4069d 165 occured. The time variable is set to the number of
screamer 0:7a64fbb4069d 166 milliseconds we waited for the message. */
screamer 0:7a64fbb4069d 167 if (time_needed < timeouts->next->time) {
screamer 0:7a64fbb4069d 168 timeouts->next->time -= time_needed;
screamer 0:7a64fbb4069d 169 } else {
screamer 0:7a64fbb4069d 170 timeouts->next->time = 0;
screamer 0:7a64fbb4069d 171 }
screamer 0:7a64fbb4069d 172 }
screamer 0:7a64fbb4069d 173 }
screamer 0:7a64fbb4069d 174 }
screamer 0:7a64fbb4069d 175
screamer 0:7a64fbb4069d 176 /**
screamer 0:7a64fbb4069d 177 * Create a one-shot timer (aka timeout). Timeouts are processed in the
screamer 0:7a64fbb4069d 178 * following cases:
screamer 0:7a64fbb4069d 179 * - while waiting for a message using sys_mbox_fetch()
screamer 0:7a64fbb4069d 180 * - while waiting for a semaphore using sys_sem_wait() or sys_sem_wait_timeout()
screamer 0:7a64fbb4069d 181 * - while sleeping using the inbuilt sys_msleep()
screamer 0:7a64fbb4069d 182 *
screamer 0:7a64fbb4069d 183 * @param msecs time in milliseconds after that the timer should expire
screamer 0:7a64fbb4069d 184 * @param h callback function to call when msecs have elapsed
screamer 0:7a64fbb4069d 185 * @param arg argument to pass to the callback function
screamer 0:7a64fbb4069d 186 */
screamer 0:7a64fbb4069d 187 void
screamer 0:7a64fbb4069d 188 sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg)
screamer 0:7a64fbb4069d 189 {
screamer 0:7a64fbb4069d 190 struct sys_timeouts *timeouts;
screamer 0:7a64fbb4069d 191 struct sys_timeo *timeout, *t;
screamer 0:7a64fbb4069d 192
screamer 0:7a64fbb4069d 193 timeout = memp_malloc(MEMP_SYS_TIMEOUT);
screamer 0:7a64fbb4069d 194 if (timeout == NULL) {
screamer 0:7a64fbb4069d 195 LWIP_ASSERT("sys_timeout: timeout != NULL", timeout != NULL);
screamer 0:7a64fbb4069d 196 return;
screamer 0:7a64fbb4069d 197 }
screamer 0:7a64fbb4069d 198 timeout->next = NULL;
screamer 0:7a64fbb4069d 199 timeout->h = h;
screamer 0:7a64fbb4069d 200 timeout->arg = arg;
screamer 0:7a64fbb4069d 201 timeout->time = msecs;
screamer 0:7a64fbb4069d 202
screamer 0:7a64fbb4069d 203 timeouts = sys_arch_timeouts();
screamer 0:7a64fbb4069d 204
screamer 0:7a64fbb4069d 205 LWIP_DEBUGF(SYS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" h=%p arg=%p\n",
screamer 0:7a64fbb4069d 206 (void *)timeout, msecs, (void*)&h, (void *)arg));
screamer 0:7a64fbb4069d 207
screamer 0:7a64fbb4069d 208 if (timeouts == NULL) {
screamer 0:7a64fbb4069d 209 LWIP_ASSERT("sys_timeout: timeouts != NULL", timeouts != NULL);
screamer 0:7a64fbb4069d 210 return;
screamer 0:7a64fbb4069d 211 }
screamer 0:7a64fbb4069d 212
screamer 0:7a64fbb4069d 213 if (timeouts->next == NULL) {
screamer 0:7a64fbb4069d 214 timeouts->next = timeout;
screamer 0:7a64fbb4069d 215 return;
screamer 0:7a64fbb4069d 216 }
screamer 0:7a64fbb4069d 217
screamer 0:7a64fbb4069d 218 if (timeouts->next->time > msecs) {
screamer 0:7a64fbb4069d 219 timeouts->next->time -= msecs;
screamer 0:7a64fbb4069d 220 timeout->next = timeouts->next;
screamer 0:7a64fbb4069d 221 timeouts->next = timeout;
screamer 0:7a64fbb4069d 222 } else {
screamer 0:7a64fbb4069d 223 for(t = timeouts->next; t != NULL; t = t->next) {
screamer 0:7a64fbb4069d 224 timeout->time -= t->time;
screamer 0:7a64fbb4069d 225 if (t->next == NULL || t->next->time > timeout->time) {
screamer 0:7a64fbb4069d 226 if (t->next != NULL) {
screamer 0:7a64fbb4069d 227 t->next->time -= timeout->time;
screamer 0:7a64fbb4069d 228 }
screamer 0:7a64fbb4069d 229 timeout->next = t->next;
screamer 0:7a64fbb4069d 230 t->next = timeout;
screamer 0:7a64fbb4069d 231 break;
screamer 0:7a64fbb4069d 232 }
screamer 0:7a64fbb4069d 233 }
screamer 0:7a64fbb4069d 234 }
screamer 0:7a64fbb4069d 235 }
screamer 0:7a64fbb4069d 236
screamer 0:7a64fbb4069d 237 /**
screamer 0:7a64fbb4069d 238 * Go through timeout list (for this task only) and remove the first matching
screamer 0:7a64fbb4069d 239 * entry, even though the timeout has not triggered yet.
screamer 0:7a64fbb4069d 240 *
screamer 0:7a64fbb4069d 241 * @note This function only works as expected if there is only one timeout
screamer 0:7a64fbb4069d 242 * calling 'h' in the list of timeouts.
screamer 0:7a64fbb4069d 243 *
screamer 0:7a64fbb4069d 244 * @param h callback function that would be called by the timeout
screamer 0:7a64fbb4069d 245 * @param arg callback argument that would be passed to h
screamer 0:7a64fbb4069d 246 */
screamer 0:7a64fbb4069d 247 void
screamer 0:7a64fbb4069d 248 sys_untimeout(sys_timeout_handler h, void *arg)
screamer 0:7a64fbb4069d 249 {
screamer 0:7a64fbb4069d 250 struct sys_timeouts *timeouts;
screamer 0:7a64fbb4069d 251 struct sys_timeo *prev_t, *t;
screamer 0:7a64fbb4069d 252
screamer 0:7a64fbb4069d 253 timeouts = sys_arch_timeouts();
screamer 0:7a64fbb4069d 254
screamer 0:7a64fbb4069d 255 if (timeouts == NULL) {
screamer 0:7a64fbb4069d 256 LWIP_ASSERT("sys_untimeout: timeouts != NULL", timeouts != NULL);
screamer 0:7a64fbb4069d 257 return;
screamer 0:7a64fbb4069d 258 }
screamer 0:7a64fbb4069d 259 if (timeouts->next == NULL) {
screamer 0:7a64fbb4069d 260 return;
screamer 0:7a64fbb4069d 261 }
screamer 0:7a64fbb4069d 262
screamer 0:7a64fbb4069d 263 for (t = timeouts->next, prev_t = NULL; t != NULL; prev_t = t, t = t->next) {
screamer 0:7a64fbb4069d 264 if ((t->h == h) && (t->arg == arg)) {
screamer 0:7a64fbb4069d 265 /* We have a match */
screamer 0:7a64fbb4069d 266 /* Unlink from previous in list */
screamer 0:7a64fbb4069d 267 if (prev_t == NULL)
screamer 0:7a64fbb4069d 268 timeouts->next = t->next;
screamer 0:7a64fbb4069d 269 else
screamer 0:7a64fbb4069d 270 prev_t->next = t->next;
screamer 0:7a64fbb4069d 271 /* If not the last one, add time of this one back to next */
screamer 0:7a64fbb4069d 272 if (t->next != NULL)
screamer 0:7a64fbb4069d 273 t->next->time += t->time;
screamer 0:7a64fbb4069d 274 memp_free(MEMP_SYS_TIMEOUT, t);
screamer 0:7a64fbb4069d 275 return;
screamer 0:7a64fbb4069d 276 }
screamer 0:7a64fbb4069d 277 }
screamer 0:7a64fbb4069d 278 return;
screamer 0:7a64fbb4069d 279 }
screamer 0:7a64fbb4069d 280
screamer 0:7a64fbb4069d 281 /**
screamer 0:7a64fbb4069d 282 * Timeout handler function for sys_sem_wait_timeout()
screamer 0:7a64fbb4069d 283 *
screamer 0:7a64fbb4069d 284 * @param arg struct sswt_cb* used to signal a semaphore and end waiting.
screamer 0:7a64fbb4069d 285 */
screamer 0:7a64fbb4069d 286 static void
screamer 0:7a64fbb4069d 287 sswt_handler(void *arg)
screamer 0:7a64fbb4069d 288 {
screamer 0:7a64fbb4069d 289 struct sswt_cb *sswt_cb = (struct sswt_cb *) arg;
screamer 0:7a64fbb4069d 290
screamer 0:7a64fbb4069d 291 /* Timeout. Set flag to TRUE and signal semaphore */
screamer 0:7a64fbb4069d 292 sswt_cb->timeflag = 1;
screamer 0:7a64fbb4069d 293 sys_sem_signal(*(sswt_cb->psem));
screamer 0:7a64fbb4069d 294 }
screamer 0:7a64fbb4069d 295
screamer 0:7a64fbb4069d 296 /**
screamer 0:7a64fbb4069d 297 * Wait for a semaphore with timeout (specified in ms)
screamer 0:7a64fbb4069d 298 *
screamer 0:7a64fbb4069d 299 * @param sem semaphore to wait
screamer 0:7a64fbb4069d 300 * @param timeout timeout in ms (0: wait forever)
screamer 0:7a64fbb4069d 301 * @return 0 on timeout, 1 otherwise
screamer 0:7a64fbb4069d 302 */
screamer 0:7a64fbb4069d 303 int
screamer 0:7a64fbb4069d 304 sys_sem_wait_timeout(sys_sem_t sem, u32_t timeout)
screamer 0:7a64fbb4069d 305 {
screamer 0:7a64fbb4069d 306 struct sswt_cb sswt_cb;
screamer 0:7a64fbb4069d 307
screamer 0:7a64fbb4069d 308 sswt_cb.psem = &sem;
screamer 0:7a64fbb4069d 309 sswt_cb.timeflag = 0;
screamer 0:7a64fbb4069d 310
screamer 0:7a64fbb4069d 311 /* If timeout is zero, then just wait forever */
screamer 0:7a64fbb4069d 312 if (timeout > 0) {
screamer 0:7a64fbb4069d 313 /* Create a timer and pass it the address of our flag */
screamer 0:7a64fbb4069d 314 sys_timeout(timeout, sswt_handler, &sswt_cb);
screamer 0:7a64fbb4069d 315 }
screamer 0:7a64fbb4069d 316 sys_sem_wait(sem);
screamer 0:7a64fbb4069d 317 /* Was it a timeout? */
screamer 0:7a64fbb4069d 318 if (sswt_cb.timeflag) {
screamer 0:7a64fbb4069d 319 /* timeout */
screamer 0:7a64fbb4069d 320 return 0;
screamer 0:7a64fbb4069d 321 } else {
screamer 0:7a64fbb4069d 322 /* Not a timeout. Remove timeout entry */
screamer 0:7a64fbb4069d 323 sys_untimeout(sswt_handler, &sswt_cb);
screamer 0:7a64fbb4069d 324 return 1;
screamer 0:7a64fbb4069d 325 }
screamer 0:7a64fbb4069d 326 }
screamer 0:7a64fbb4069d 327
screamer 0:7a64fbb4069d 328 /**
screamer 0:7a64fbb4069d 329 * Sleep for some ms. Timeouts are processed while sleeping.
screamer 0:7a64fbb4069d 330 *
screamer 0:7a64fbb4069d 331 * @param ms number of milliseconds to sleep
screamer 0:7a64fbb4069d 332 */
screamer 0:7a64fbb4069d 333 void
screamer 0:7a64fbb4069d 334 sys_msleep(u32_t ms)
screamer 0:7a64fbb4069d 335 {
screamer 0:7a64fbb4069d 336 sys_sem_t delaysem = sys_sem_new(0);
screamer 0:7a64fbb4069d 337
screamer 0:7a64fbb4069d 338 sys_sem_wait_timeout(delaysem, ms);
screamer 0:7a64fbb4069d 339
screamer 0:7a64fbb4069d 340 sys_sem_free(delaysem);
screamer 0:7a64fbb4069d 341 }
screamer 0:7a64fbb4069d 342
screamer 0:7a64fbb4069d 343
screamer 0:7a64fbb4069d 344 #endif /* NO_SYS */