From: <ljs...@us...> - 2007-05-25 14:37:20
|
Revision: 411 http://svn.sourceforge.net/cadcdev/?rev=411&view=rev Author: ljsebald Date: 2007-05-25 07:37:18 -0700 (Fri, 25 May 2007) Log Message: ----------- Made the UDP code so that it works in an irq properly. Modified Paths: -------------- kos/kernel/net/net_udp.c Modified: kos/kernel/net/net_udp.c =================================================================== --- kos/kernel/net/net_udp.c 2007-05-25 14:28:34 UTC (rev 410) +++ kos/kernel/net/net_udp.c 2007-05-25 14:37:18 UTC (rev 411) @@ -15,6 +15,7 @@ #include <sys/queue.h> #include <kos/dbgio.h> #include <kos/fs_socket.h> +#include <arch/irq.h> #include <sys/socket.h> #include <errno.h> #include "net_ipv4.h" @@ -70,7 +71,15 @@ /* Get the sockaddr_in structure, rather than the sockaddr one */ realaddr = (struct sockaddr_in *) addr; - mutex_lock(udp_mutex); + if(irq_inside_int()) { + if(mutex_trylock(udp_mutex) == -1) { + errno = EWOULDBLOCK; + return -1; + } + } + else { + mutex_lock(udp_mutex); + } udpsock = (struct udp_sock *)hnd->data; if(udpsock == NULL) { @@ -133,7 +142,15 @@ return -1; } - mutex_lock(udp_mutex); + if(irq_inside_int()) { + if(mutex_trylock(udp_mutex) == -1) { + errno = EWOULDBLOCK; + return -1; + } + } + else { + mutex_lock(udp_mutex); + } udpsock = (struct udp_sock *)hnd->data; if(udpsock == NULL) { @@ -172,7 +189,15 @@ struct udp_sock *udpsock; struct udp_pkt *pkt; - mutex_lock(udp_mutex); + if(irq_inside_int()) { + if(mutex_trylock(udp_mutex) == -1) { + errno = EWOULDBLOCK; + return -1; + } + } + else { + mutex_lock(udp_mutex); + } udpsock = (struct udp_sock *)hnd->data; if(udpsock == NULL) { @@ -199,7 +224,8 @@ return -1; } - if(TAILQ_EMPTY(&udpsock->packets) && (udpsock->flags & O_NONBLOCK)) { + if(TAILQ_EMPTY(&udpsock->packets) && ((udpsock->flags & O_NONBLOCK) || + irq_inside_int())) { mutex_unlock(udp_mutex); errno = EWOULDBLOCK; return -1; @@ -234,7 +260,15 @@ struct udp_sock *udpsock; struct udp_pkt *pkt; - mutex_lock(udp_mutex); + if(irq_inside_int()) { + if(mutex_trylock(udp_mutex) == -1) { + errno = EWOULDBLOCK; + return -1; + } + } + else { + mutex_lock(udp_mutex); + } udpsock = (struct udp_sock *)hnd->data; if(udpsock == NULL) { @@ -254,7 +288,8 @@ return -1; } - if(TAILQ_EMPTY(&udpsock->packets) && (udpsock->flags & O_NONBLOCK)) { + if(TAILQ_EMPTY(&udpsock->packets) && ((udpsock->flags & O_NONBLOCK) || + irq_inside_int())) { mutex_unlock(udp_mutex); errno = EWOULDBLOCK; return -1; @@ -304,7 +339,15 @@ int flags) { struct udp_sock *udpsock; - mutex_lock(udp_mutex); + if(irq_inside_int()) { + if(mutex_trylock(udp_mutex) == -1) { + errno = EWOULDBLOCK; + return -1; + } + } + else { + mutex_lock(udp_mutex); + } udpsock = (struct udp_sock *)hnd->data; if(udpsock == NULL) { @@ -366,7 +409,15 @@ struct udp_sock *udpsock; struct sockaddr_in *realaddr; - mutex_lock(udp_mutex); + if(irq_inside_int()) { + if(mutex_trylock(udp_mutex) == -1) { + errno = EWOULDBLOCK; + return -1; + } + } + else { + mutex_lock(udp_mutex); + } udpsock = (struct udp_sock *)hnd->data; if(udpsock == NULL) { @@ -419,7 +470,15 @@ int net_udp_shutdownsock(net_socket_t *hnd, int how) { struct udp_sock *udpsock; - mutex_lock(udp_mutex); + if(irq_inside_int()) { + if(mutex_trylock(udp_mutex) == -1) { + errno = EWOULDBLOCK; + return -1; + } + } + else { + mutex_lock(udp_mutex); + } udpsock = (struct udp_sock *)hnd->data; if(udpsock == NULL) { @@ -461,7 +520,16 @@ TAILQ_INIT(&udpsock->packets); - mutex_lock(udp_mutex); + if(irq_inside_int()) { + if(mutex_trylock(udp_mutex) == -1) { + errno = EWOULDBLOCK; + return -1; + } + } + else { + mutex_lock(udp_mutex); + } + LIST_INSERT_HEAD(&net_udp_sockets, udpsock, sock_list); mutex_unlock(udp_mutex); @@ -474,12 +542,21 @@ struct udp_sock *udpsock; struct udp_pkt *pkt; - mutex_lock(udp_mutex); + if(irq_inside_int()) { + if(mutex_trylock(udp_mutex) == -1) { + errno = EWOULDBLOCK; + return; + } + } + else { + mutex_lock(udp_mutex); + } udpsock = (struct udp_sock *)hnd->data; if(udpsock == NULL) { mutex_unlock(udp_mutex); errno = EBADF; + return; } TAILQ_FOREACH(pkt, &udpsock->packets, pkt_queue) { @@ -497,7 +574,15 @@ int net_udp_setflags(net_socket_t *hnd, int flags) { struct udp_sock *udpsock; - mutex_lock(udp_mutex); + if(irq_inside_int()) { + if(mutex_trylock(udp_mutex) == -1) { + errno = EWOULDBLOCK; + return -1; + } + } + else { + mutex_lock(udp_mutex); + } udpsock = (struct udp_sock *) hnd->data; if(udpsock == NULL) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |