[Spread-cvs] commit: r406 - in trunk: . daemon

jonathan at spread.org jonathan at spread.org
Mon Nov 17 20:18:49 EST 2008


Author: jonathan
Date: 2008-11-17 20:18:48 -0500 (Mon, 17 Nov 2008)
New Revision: 406

Modified:
   trunk/configure
   trunk/configure.in
   trunk/daemon/Changelog
   trunk/daemon/data_link.c
Log:
Add a test for sockaddr.sin_len to configure.in. Define HAVE_SIN_LEN_IN_STRUCT_SOCKADDR_IN if it is present and can be set. 

In data_link.c, remove static types from local variables in DL_send/recv so they can be called safely from threaded
code. Also memset to 0 the msg struct and re-set the select_delay value to 10,000 us for each call to select so it 
does not get updated by some OS's (like older linux) in the call and thus be set to 0 for later calls to select, 
which would cause spinning.


Modified: trunk/configure
===================================================================
--- trunk/configure	2008-10-24 06:53:11 UTC (rev 405)
+++ trunk/configure	2008-11-18 01:18:48 UTC (rev 406)
@@ -9451,6 +9451,70 @@
 
 fi
 
+{ $as_echo "$as_me:$LINENO: checking for sin_len field in sockaddr_in" >&5
+$as_echo_n "checking for sin_len field in sockaddr_in... " >&6; }
+if test "${ac_cv_have_sin_len_in_struct_sockaddr_in+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+
+	cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+int
+main ()
+{
+ struct sockaddr_in s; s.sin_len = sizeof(s);
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+   ac_cv_have_sin_len_in_struct_sockaddr_in="yes"
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	 ac_cv_have_sin_len_in_struct_sockaddr_in="no"
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_sin_len_in_struct_sockaddr_in" >&5
+$as_echo "$ac_cv_have_sin_len_in_struct_sockaddr_in" >&6; }
+if test x"$ac_cv_have_sin_len_in_struct_sockaddr_in" = "xyes"; then
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_SIN_LEN_IN_SOCKADDR_IN 1
+_ACEOF
+
+fi
+
 { $as_echo "$as_me:$LINENO: checking for ss_family field in struct sockaddr_storage" >&5
 $as_echo_n "checking for ss_family field in struct sockaddr_storage... " >&6; }
 if test "${ac_cv_have_ss_family_in_struct_ss+set}" = set; then

Modified: trunk/configure.in
===================================================================
--- trunk/configure.in	2008-10-24 06:53:11 UTC (rev 405)
+++ trunk/configure.in	2008-11-18 01:18:48 UTC (rev 406)
@@ -504,6 +504,23 @@
 	AC_DEFINE(HAVE_SUN_LEN_IN_SOCKADDR_UN, 1, sockaddr_un type has sun_len field)
 fi
 
+AC_CACHE_CHECK([for sin_len field in sockaddr_in],
+		ac_cv_have_sin_len_in_struct_sockaddr_in, [
+	AC_TRY_COMPILE(
+  		[
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+		],
+		[ struct sockaddr_in s; s.sin_len = sizeof(s); ],
+		[ ac_cv_have_sin_len_in_struct_sockaddr_in="yes" ],
+		[ ac_cv_have_sin_len_in_struct_sockaddr_in="no"],
+	)
+])
+if test x"$ac_cv_have_sin_len_in_struct_sockaddr_in" = "xyes"; then
+   	AC_DEFINE(HAVE_SIN_LEN_IN_SOCKADDR_IN, 1 ,[sockaddr_in type has sin_len field])
+fi
+
 AC_CACHE_CHECK([for ss_family field in struct sockaddr_storage],
 		ac_cv_have_ss_family_in_struct_ss, [
 	AC_TRY_COMPILE(

Modified: trunk/daemon/Changelog
===================================================================
--- trunk/daemon/Changelog	2008-10-24 06:53:11 UTC (rev 405)
+++ trunk/daemon/Changelog	2008-11-18 01:18:48 UTC (rev 406)
@@ -1,3 +1,11 @@
+Mon Nov 17 20:12:20 2008  Jonathan Stanton  <jonathan at spreadconcepts.com>
+
+	* data_link.c (DL_send): Zero the msg struct before filling it in. 
+	Remove static types from local variables in DL_send/recv so that
+	they can be called from different threads safely. Add configure.in
+	test for sockaddr.sin_len field so it can be correctly set for those
+	OS's that need it. 
+
 Fri Oct 24 02:47:10 2008  Jonathan Stanton  <jonathan at spreadconcepts.com>
 
 	* aclocal.m4: Update autoconf macro (and makefiles) to improve 

Modified: trunk/daemon/data_link.c
===================================================================
--- trunk/daemon/data_link.c	2008-10-24 06:53:11 UTC (rev 405)
+++ trunk/daemon/data_link.c	2008-11-18 01:18:48 UTC (rev 406)
@@ -98,6 +98,9 @@
         	soc_addr.sin_family    	= AF_INET;
         	soc_addr.sin_port	= htons(port);
                 memset(&soc_addr.sin_zero, 0, sizeof(soc_addr.sin_zero));
+#ifdef HAVE_SIN_LEN_IN_STRUCT_SOCKADDR_IN
+                soc_addr.sin_len        = sizeof(soc_addr);
+#endif
                 if (interface_address == 0)
                         soc_addr.sin_addr.s_addr= INADDR_ANY;
                 else 
@@ -160,13 +163,13 @@
 {
 
 #ifndef ARCH_SCATTER_NONE
-static	struct	msghdr		msg;
+        struct	msghdr		msg;
 #else	/* ARCH_SCATTER_NONE */
-static	char	pseudo_scat[MAX_PACKET_SIZE];
+        char	pseudo_scat[MAX_PACKET_SIZE];
 #endif	/* ARCH_SCATTER_NONE */
 	
-static	struct  sockaddr_in	soc_addr;
-static	struct timeval 		select_delay = { 0, 10000 };
+	struct  sockaddr_in	soc_addr;
+	struct timeval 		select_delay = { 0, 10000 };
 	int			ret;
 	int			total_len;
 	int			i;
@@ -180,11 +183,16 @@
 	soc_addr.sin_addr.s_addr= htonl(address);
 	soc_addr.sin_port	= htons(port);
 
+#ifdef HAVE_SIN_LEN_IN_STRUCT_SOCKADDR_IN
+        soc_addr.sin_len       = sizeof(soc_addr);
+#endif
+
 #ifdef ARCH_PC_HOME
 	soc_addr.sin_addr.s_addr= htonl(-1073741814);
 #endif /* ARCH_PC_HOME */
 
 #ifndef ARCH_SCATTER_NONE
+        memset(&msg, 0, sizeof(msg));
 	msg.msg_name 	= (caddr_t) &soc_addr;
 	msg.msg_namelen = sizeof(soc_addr);
 	msg.msg_iov	= (struct iovec *)scat->elements;
@@ -228,6 +236,8 @@
 			Alarm( DATA_LINK, "DL_send: delaying after failure in send to %d.%d.%d.%d, ret is %d\n", 
 				IP1(address), IP2(address), IP3(address), IP4(address), ret);
 			select( 0, 0, 0, 0, &select_delay );
+			select_delay.tv_sec = 0;
+			select_delay.tv_usec = 10000;
 		}
 	}
 	if (ret < 0)




More information about the Spread-cvs mailing list