[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