diff net.rhope @ 165:47ab97730865

Fix a couple of issues in networking lib
author Mike Pavone <pavone@retrodev.com>
date Thu, 10 Mar 2011 04:15:37 +0000
parents e9a8269384bb
children 1bfc19076f1b
line wrap: on
line diff
--- a/net.rhope	Fri Jan 07 03:19:26 2011 -0500
+++ b/net.rhope	Thu Mar 10 04:15:37 2011 +0000
@@ -19,6 +19,7 @@
 	_internal_bindnewsocket[port(Int32,Naked),setreuse(Int32,Naked):socket(Int32,Naked)]
 	_internal_accept[sockfd(Int32,Naked),addrbuf(Array,Raw Pointer,Mutable),buflen(Int32,Naked):consock(Int32,Naked),addrbuf]
 	_internal_connectnewsocket[addr(Array,Raw Pointer),port(Int32,Naked):sockfd(Int32,Naked)]
+	_internal_ignoresigpipe[:out(Int32,Naked)]
 }
 
 Blueprint epoll_event
@@ -69,8 +70,9 @@
 				{ res <- No }
 				{ res <- Yes }
 				ct,cont <- _Get IO Context[activefd]
-				{
+				{ 
 				}{ Print["Could not find context for IO event"] }
+
 				,cont <- Resume[ct,res]
 				{
 					cont <- Yield[]
@@ -112,6 +114,7 @@
 
 _Sock Listener[pipefd]
 {
+	_internal_ignoresigpipe[]
 	epfd <- epoll_create[16]
 	If[[epfd]=[-1]]
 	{
@@ -133,7 +136,7 @@
 	pipefd <- -1
 }
 
-_Add FD to Listener[fd,context:pipefd,err] uses socklisten
+__Add FD to Listener[fd,context:pipefd,err,startpipe] uses socklisten
 {
 	If[socklisten::listener started]
 	{
@@ -154,7 +157,7 @@
 			fcntl[[des]Index[0], 4i32, 2048i64]
 			fcntl[[des]Index[1], 4i32, 2048i64]
 			socklisten::listener started <- Yes
-			Call Async[_Sock Listener[[des]Index[0],?]]
+			startpipe <- [des]Index[0]
 			do add <- Yes
 		}
 	}
@@ -164,6 +167,12 @@
 	}
 }
 
+_Add FD to Listener[fd,context:pipefd,err]
+{
+	pipefd,err <- __Add FD to Listener[fd,context] {} {}
+	{ Call Async[_Sock Listener[~,?]] }
+}
+
 _Write to Listener Pipe[pipefd,data]
 {
 	res <- write[pipefd, data, 8i64]
@@ -270,14 +279,18 @@
 
 _Write@TCP Connection[con,buffer,wrote:out,err]
 {
-	
 	new wrote <- write[[con]Filedes >>, buffer, Int64[[buffer]Length]]
-	If[[new wrote]=[-1]]
+	If[[new wrote]<[1]]
 	{
-		If[Wait for IO[[con]Filedes >>, 4]]
+		,doerr <- If[new wrote]
 		{
-			out,err <- [con]_Write[buffer,wrote]
-		}{
+			,doerr <- If[Wait for IO[[con]Filedes >>, 4]]
+			{
+				out,err <- [con]_Write[buffer,wrote]
+			}
+		}
+		Val[doerr]
+		{
 			err <- wrote
 		}
 	}{
@@ -439,12 +452,17 @@
 	{ numread <- Trunc Int32[~] }
 	{ outbuf <- [~]Length <<[numread] }
 	
-	If[[numread]=[-1]]
+	If[[numread]<[1]]
 	{
-		If[Wait for IO[[con]Filedes >>, 1]]
+		doerr <- If[[numread]=[0]] {}
 		{
-			data,out con,err <- [con]_Read Delim[delim,poffset,buflist]
-		}{
+			,doerr <- If[Wait for IO[[con]Filedes >>, 1]]
+			{
+				data,out con,err <- [con]_Read Delim[delim,poffset,buflist]
+			}
+		}
+		Val[doerr]
+		{
 			err <- [Fold[_Add Len[?], 0, buflist]]+[Length[[con]Read Buffer >>]]
 		}
 	}{
@@ -544,7 +562,7 @@
 		poffset <- -1
 		
 	}
-	data,out con,err <- [ncon]_Read Delim[delim,poffset,buflist]
+	data,out con,err <- [ncon]_Read Delim[delim,poffset,buflist] {} {}
 }
 
 Close@TCP Connection[con:out]