|
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.
|