Embedded WebSockets Experiment

Dependencies:   mbed MD5

Committer:
nandgate
Date:
Tue Jul 26 05:30:53 2011 +0000
Revision:
0:6dee052a3fa4

        

Who changed what in which revision?

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