From b971de162044b7e27291a5cd23723e703db1547f Mon Sep 17 00:00:00 2001 From: "chaehee.hong" Date: Thu, 2 Feb 2017 23:28:27 -0800 Subject: [PATCH] [Title] Merge Posix cancellation point [Description] for network [Module] network [Board] ARTIK051 [Verification] na [Reference] na [Author] Chaehee Hong Change-Id: Ic440908ff05fa02684ace61ee15164b508856e1b Conflicts: os/net/lwip/sys/arch/sys_arch.c --- os/include/net/lwip/sys.h | 1 + os/net/lwip/sys/arch/sys_arch.c | 36 ++++++++++++++----- os/net/socket/bsd_socket_api.c | 76 ++++++++++++++++++++++++++++++++--------- 3 files changed, 88 insertions(+), 25 deletions(-) diff --git a/os/include/net/lwip/sys.h b/os/include/net/lwip/sys.h index 60600d2..82ff6ad 100644 --- a/os/include/net/lwip/sys.h +++ b/os/include/net/lwip/sys.h @@ -94,6 +94,7 @@ typedef u8_t sys_mbox_t; /** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */ #define SYS_ARCH_TIMEOUT 0xffffffffUL +#define SYS_ARCH_CANCELED 0xfffffffeUL /** sys_mbox_tryfetch() returns SYS_MBOX_EMPTY if appropriate. * For now we use the same magic value, but we allow this to change in future. diff --git a/os/net/lwip/sys/arch/sys_arch.c b/os/net/lwip/sys/arch/sys_arch.c index d7f09d1..bee0647 100755 --- a/os/net/lwip/sys/arch/sys_arch.c +++ b/os/net/lwip/sys/arch/sys_arch.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -128,8 +129,11 @@ void sys_mbox_post(sys_mbox_t *mbox, void *msg) { u8_t first_msg = 0; u32_t tmp = 0; - sys_arch_sem_wait(&(mbox->mutex), 0); - + u32_t status = OK; + status = sys_arch_sem_wait(&(mbox->mutex), 0); + if (status == SYS_ARCH_CANCELED) { + return; + } LWIP_DEBUGF(SYS_DEBUG, ("mbox %p msg %p\n", (void *)mbox, (void *)msg)); /* Wait while the queue is full */ tmp = (mbox->rear + 1) % mbox->queue_size; @@ -137,10 +141,13 @@ void sys_mbox_post(sys_mbox_t *mbox, void *msg) LWIP_DEBUGF(SYS_DEBUG, ("Queue Full, Wait until gets free\n")); } while (tmp == mbox->front) { + if (status == SYS_ARCH_CANCELED) { + return; + } mbox->wait_send++; sys_sem_signal(&(mbox->mutex)); sys_arch_sem_wait(&(mbox->mail), 0); - sys_arch_sem_wait(&(mbox->mutex), 0); + status = sys_arch_sem_wait(&(mbox->mutex), 0); mbox->wait_send--; } @@ -237,19 +244,28 @@ errout_with_mutex: * void **msg -- Pointer to pointer to msg received * u32_t timeout -- Number of milliseconds until timeout * Outputs: - * u32_t -- SYS_ARCH_TIMEOUT if timeout, else number - * of milliseconds until received. + * u32_t -- SYS_ARCH_CANCELED if the operation canceled, + * SYS_ARCH_TIMEOUT if timeout, else number + * of milliseconds until received. *---------------------------------------------------------------------------*/ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) { u32_t time = 0; + u32_t status = OK; /* The mutex lock is quick so we don't bother with the timeout stuff here. */ - sys_arch_sem_wait(&(mbox->mutex), 0); + status = sys_arch_sem_wait(&(mbox->mutex), 0); + if (status == SYS_ARCH_CANCELED) { + return SYS_ARCH_CANCELED; + } /* wait while the queue is empty */ while (mbox->front == mbox->rear) { + if (status == SYS_ARCH_CANCELED) { + return SYS_ARCH_CANCELED; + } + mbox->wait_fetch++; sys_sem_signal(&(mbox->mutex)); @@ -268,7 +284,7 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) sys_arch_sem_wait(&(mbox->mail), 0); } - sys_arch_sem_wait(&(mbox->mutex), 0); + status = sys_arch_sem_wait(&(mbox->mutex), 0); mbox->wait_fetch--; } @@ -432,7 +448,8 @@ err_t sys_sem_new(sys_sem_t *sem, u8_t count) * sys_sem_t sem -- Semaphore to wait on * u32_t timeout -- Number of milliseconds until timeout * Outputs: - * u32_t -- Time elapsed or SYS_ARCH_TIMEOUT. + * u32_t -- SYS_ARCH_CANCELED if the operation canceled, + * SYS_ARCH_TIMEOUT if timeout, else time elapsed. *---------------------------------------------------------------------------*/ u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) { @@ -447,6 +464,9 @@ u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) * Restart If signal is EINTR else crash on Assert as we can't receive ETIMEDOUT */ status = get_errno(); + if (status == ECANCELED) { + return SYS_ARCH_CANCELED; + } LWIP_ASSERT("status == EINTR", status == EINTR); } status = OK; diff --git a/os/net/socket/bsd_socket_api.c b/os/net/socket/bsd_socket_api.c index 345c295..0b749be 100644 --- a/os/net/socket/bsd_socket_api.c +++ b/os/net/socket/bsd_socket_api.c @@ -54,6 +54,7 @@ */ #include +#include #ifdef CONFIG_NET @@ -61,89 +62,130 @@ int bind(int s, const struct sockaddr *name, socklen_t namelen) { - return lwip_bind(s, name, namelen); + int result = lwip_bind(s, name, namelen); + return result; } int accept(int s, struct sockaddr *addr, socklen_t *addrlen) { - return lwip_accept(s, addr, addrlen); + /* Treat as a cancellation point */ + (void)enter_cancellation_point(); + int result = lwip_accept(s, addr, addrlen); + leave_cancellation_point(); + return result; } int shutdown(int s, int how) { - return lwip_shutdown(s, how); + int result = lwip_shutdown(s, how); + return result; } int closesocket(int s) { - return lwip_close(s); + /* Treat as a cancellation point */ + (void)enter_cancellation_point(); + int result = lwip_close(s); + leave_cancellation_point(); + return result; } int connect(int s, const struct sockaddr *name, socklen_t namelen) { - return lwip_connect(s, name, namelen); + /* Treat as a cancellation point */ + (void)enter_cancellation_point(); + int result = lwip_connect(s, name, namelen); + leave_cancellation_point(); + return result; } int getsockname(int s, struct sockaddr *name, socklen_t *namelen) { - return lwip_getsockname(s, name, namelen); + int result = lwip_getsockname(s, name, namelen); + return result; } int getpeername(int s, struct sockaddr *name, socklen_t *namelen) { - return lwip_getpeername(s, name, namelen); + int result = lwip_getpeername(s, name, namelen); + return result; } int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) { - return lwip_setsockopt(s, level, optname, optval, optlen); + int result = lwip_setsockopt(s, level, optname, optval, optlen); + return result; } int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) { - return lwip_getsockopt(s, level, optname, optval, optlen); + int result = lwip_getsockopt(s, level, optname, optval, optlen); + return result; } int listen(int s, int backlog) { - return lwip_listen(s, backlog); + int result = lwip_listen(s, backlog); + return result; } int recv(int s, void *mem, size_t len, int flags) { - return lwip_recv(s, mem, len, flags); + /* Treat as a cancellation point */ + (void)enter_cancellation_point(); + int result = lwip_recv(s, mem, len, flags); + leave_cancellation_point(); + return result; } int recvfrom(int s, void *mem, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen) { - return lwip_recvfrom(s, mem, len, flags, from, fromlen); + /* Treat as a cancellation point */ + (void)enter_cancellation_point(); + int result = lwip_recvfrom(s, mem, len, flags, from, fromlen); + leave_cancellation_point(); + return result; } int send(int s, const void *data, size_t size, int flags) { - return lwip_send(s, data, size, flags); + /* Treat as a cancellation point */ + (void)enter_cancellation_point(); + int result = lwip_send(s, data, size, flags); + leave_cancellation_point(); + return result; } int sendto(int s, const void *data, size_t size, int flags, const struct sockaddr *to, socklen_t tolen) { - return lwip_sendto(s, data, size, flags, to, tolen); + /* Treat as a cancellation point */ + (void)enter_cancellation_point(); + int result = lwip_sendto(s, data, size, flags, to, tolen); + leave_cancellation_point(); + return result; } int socket(int domain, int type, int protocol) { - return lwip_socket(domain, type, protocol); + int result = lwip_socket(domain, type, protocol); + return result; } #ifdef CONFIG_DISABLE_POLL int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout) { - return lwip_select(maxfdp1, readset, writeset, exceptset, timeout); + /* Treat as a cancellation point */ + (void)enter_cancellation_point(); + int result = lwip_select(maxfdp1, readset, writeset, exceptset, timeout); + leave_cancellation_point(); + return result; } #endif int ioctlsocket(int s, long cmd, void *argp) { - return lwip_ioctl(s, cmd, argp); + int result = lwip_ioctl(s, cmd, argp); + return result; } #endif -- 2.7.4