[Spread-cvs] commit: r671 - trunk/libspread-util/src
jschultz at spread.org
jschultz at spread.org
Wed Jan 22 01:17:59 EST 2014
Author: jschultz
Date: 2014-01-22 01:17:58 -0500 (Wed, 22 Jan 2014)
New Revision: 671
Modified:
trunk/libspread-util/src/arch.c
trunk/libspread-util/src/arch.h
trunk/libspread-util/src/data_link.c
Log:
Partial cleanup of code -- mostly white space changes. Eliminated some redundant / pointless #defines. Improved and largely eliminated retry logic in DL_send.
Modified: trunk/libspread-util/src/arch.c
===================================================================
--- trunk/libspread-util/src/arch.c 2014-01-22 03:45:18 UTC (rev 670)
+++ trunk/libspread-util/src/arch.c 2014-01-22 06:17:58 UTC (rev 671)
@@ -38,7 +38,7 @@
#include <stdio.h>
#ifdef ARCH_PC_WIN95
-#include <winsock.h>
+# include <winsock.h>
#endif
#ifndef HAVE_STRERROR
@@ -60,7 +60,7 @@
#ifdef ARCH_PC_WIN95
/* return value only valid until next call to sock_strerror */
-char *sock_strerror(int err)
+char *sock_strerror( int err )
{
switch( err ) {
case WSANOTINITIALISED:
Modified: trunk/libspread-util/src/arch.h
===================================================================
--- trunk/libspread-util/src/arch.h 2014-01-22 03:45:18 UTC (rev 670)
+++ trunk/libspread-util/src/arch.h 2014-01-22 06:17:58 UTC (rev 671)
@@ -39,9 +39,9 @@
* Each record in this file represents an architecture.
* Each record contains the following fields:
*
- * #define INTSIZE{16,32,64}
- * #define ARCH_SCATTER_{CONTROL,ACCRIGHTS,NONE}
- * #define ARCH_ENDIAN{0x00000000,0x80000080}
+ * #define INTSIZE{16,32,64}
+ * #define ARCH_SCATTER_{CONTROL,ACCRIGHTS,NONE}
+ * #define ARCH_ENDIAN{0x00000000,0x80000080}
* #define LOC_INLINE { __inline__ or blank }
* #define ARCH_SCATTER_SIZE { sys dependent variable }
* #define HAVE_GOOD_VARGS ( exists if true )
@@ -58,119 +58,124 @@
#undef INTSIZE64
#undef INTSIZE16
-
#ifndef ARCH_PC_WIN95
/* If we aren't using windows... we can use autoconf */
-#include "config.h"
+# include "config.h"
-
-#ifdef WORDS_BIGENDIAN
-#define ARCH_ENDIAN 0x00000000
-#else
-#define ARCH_ENDIAN 0x80000080
-#endif
+# ifdef WORDS_BIGENDIAN
+# define ARCH_ENDIAN 0x00000000
+# else
+# define ARCH_ENDIAN 0x80000080
+# endif
-#define LOC_INLINE __inline__
+# define LOC_INLINE __inline__
-#ifndef __GNUC__
-#define __inline__ inline
-#endif
+# ifndef __GNUC__
+# define __inline__ inline
+# endif
/* Need to add special cases, SUNOS gets 64, IRIX gets 512 */
-#ifdef MSG_MAXIOVLEN
-#define ARCH_SCATTER_SIZE MSG_MAXIOVLEN
-#else
-#define ARCH_SCATTER_SIZE 1024
-#endif
+# ifdef MSG_MAXIOVLEN
+# define ARCH_SCATTER_SIZE MSG_MAXIOVLEN
+# else
+# define ARCH_SCATTER_SIZE 1024
+# endif
-#define HAVE_GOOD_VARGS
+# define HAVE_GOOD_VARGS
-#ifndef ERR_TIMEDOUT
-#define ERR_TIMEDOUT ETIMEDOUT
-#endif
+# ifndef ERR_TIMEDOUT
+# define ERR_TIMEDOUT ETIMEDOUT
+# endif
-#ifndef RAND_MAX
-#define RAND_MAX 2147483647
-#endif
+# ifndef RAND_MAX
+# define RAND_MAX 2147483647
+# endif
-#define sock_errno errno
-#define sock_strerror strerror
-#define sock_set_errno(a) (errno = (a))
+# define sock_errno errno
+# define sock_strerror strerror
+# define sock_set_errno(a) (errno = (a))
-#ifndef byte
-#define byte u_int8_t
-#endif
+# ifndef byte
+# define byte u_int8_t
+# endif
-#ifndef int16
-#define int16 int16_t
-#endif
+# ifndef int16
+# define int16 int16_t
+# endif
-#ifndef int16u
-#define int16u u_int16_t
-#endif
+# ifndef int16u
+# define int16u u_int16_t
+# endif
-#ifndef int32
-#define int32 int32_t
-#endif
+# ifndef int32
+# define int32 int32_t
+# endif
-#ifndef int32u
-#define int32u u_int32_t
-#endif
+# ifndef int32u
+# define int32u u_int32_t
+# endif
#else
/* We are using windows... */
-#define INTSIZE32
-#define ARCH_SCATTER_NONE
-#define ARCH_ENDIAN 0x80000080
-#define LOC_INLINE
-#define BADCLOCK
-#define HAVE_GOOD_VARGS
+# define INTSIZE32
+# define ARCH_SCATTER_NONE
+# define ARCH_ENDIAN 0x80000080
+# define LOC_INLINE
+# define BADCLOCK
+# define HAVE_GOOD_VARGS
+
/* Windows now has a strerror function and if we do not use it
* compile errors occur with shared DLL libraries.
*/
-#define HAVE_STRERROR
-/* This size is for packing several messages into one packet */
-#define ARCH_SCATTER_SIZE 64
-#define ERR_TIMEDOUT EAGAIN
-#define sock_errno WSAGetLastError()
-#define sock_set_errno WSASetLastError
-#define MAXPATHLEN _MAX_PATH
-#define snprintf _snprintf
-#define alloca _alloca
+# define HAVE_STRERROR
+# define ARCH_SCATTER_SIZE 64
+# define ERR_TIMEDOUT EAGAIN
+# define sock_errno WSAGetLastError()
+# define sock_set_errno WSASetLastError
+# define MAXPATHLEN _MAX_PATH
+# define snprintf _snprintf
+# define alloca _alloca
+
/* Sockets are not file descriptors on windows so they need a special close function. */
-#define close closesocket
+# define close closesocket
+
/* Windows defines a default size of 64. However, the size of fd_set array for select
* can be raised by defining a larger constant before including windows.h winsock.h
*/
-#define FD_SETSIZE 1024
+# define FD_SETSIZE 1024
-#include <ws2tcpip.h> /* after definition of FD_SETSIZE! */
+# include <ws2tcpip.h> /* after definition of FD_SETSIZE! */
-#define HAVE_SOCKLEN_T 1
-typedef int sockopt_len_t;
+# define HAVE_SOCKLEN_T 1
+typedef int sockopt_len_t;
/* System location of spread.conf file */
-#define SPREAD_ETCDIR "/etc"
+# define SPREAD_ETCDIR "/etc"
+
/* Use winsock constants since we are dealing with sockets
* Note: If we ever need file IO with errno's we will have conflicts
* since the WSA version and the basic E versions may not have the same
* number. Right now we don't need the E versions for windows so we just
* use the WSA versions.
*/
-#undef EINTR
-#undef EAGAIN
-#undef EWOULDBLOCK
-#undef EINPROGRESS
-#undef EALREADY
-#define EWOULDBLOCK WSAEWOULDBLOCK
-#define EINTR WSAEINTR
-#define EAGAIN WSAEWOULDBLOCK
-#define EINPROGRESS WSAEINPROGRESS
-#define EALREADY WSAEALREADY
+# undef EINTR
+# define EINTR WSAEINTR
+# undef EAGAIN
+# define EAGAIN WSAEWOULDBLOCK
+
+# undef EWOULDBLOCK
+# define EWOULDBLOCK WSAEWOULDBLOCK
+
+# undef EINPROGRESS
+# define EINPROGRESS WSAEINPROGRESS
+
+# undef EALREADY
+# define EALREADY WSAEALREADY
+
/* Windows does not define MAXHOSTNAMELEN, so we define it here to a reasonable host name limit */
-#define MAXHOSTNAMELEN 128
+#define MAXHOSTNAMELEN 256
/* byte is already defined as a typedef to unsigned char on Windows XP (and probably earlier) so do not define
* #ifndef byte
@@ -178,90 +183,87 @@
* #endif
*/
-#ifndef int16
-#define int16 short
-char *sock_strerror(int err); /* forward declare this func from the arch.c file (win32 only) */
+# ifndef int16
+# define int16 short
+# endif
-#endif
+# ifndef int16u
+# define int16u unsigned short
+# endif
-#ifndef int16u
-#define int16u unsigned short
-#endif
+# ifndef int32
+# define int32 int
+# endif
-#ifndef int32
-#define int32 int
-#endif
+# ifndef int32u
+# define int32u unsigned int
+# endif
-#ifndef int32u
-#define int32u unsigned int
-#endif
+# ifndef UINT32_MAX
+# define UINT32_MAX UINT_MAX
+# endif
-#ifndef UINT32_MAX
-#define UINT32_MAX UINT_MAX
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX INT_MAX
-#endif
+# ifndef INT32_MAX
+# define INT32_MAX INT_MAX
+# endif
-#ifndef int64_t
-#define int64_t __int64
-#endif
+# ifndef int64_t
+# define int64_t __int64
+# endif
-#define PRId64 "I64d"
+# define PRId64 "I64d"
-
/* Declare functions from arch.c */
-char *sock_strerror(int err);
+char *sock_strerror(int err);
#endif /* ARCH_PC_WIN95 */
/* Pick which rand version to use */
#ifdef HAVE_LRAND48
-#define get_rand lrand48
+# define get_rand lrand48
#else
-#define get_rand rand
+# define get_rand rand
#endif
/* Useful CPP macros to make strings from #defines */
#define Q(x) # x
#define QQ(x) Q(x)
-
#define ENDIAN_TYPE 0x80000080
-#define Get_endian( type ) ( (type) & ENDIAN_TYPE )
-#define Set_endian( type ) ( ( (type) & ~ENDIAN_TYPE )| ARCH_ENDIAN )
-#define Same_endian( type ) ( ( (type) & ENDIAN_TYPE ) == ARCH_ENDIAN )
-#define Clear_endian( type ) ( (type) & ~ENDIAN_TYPE )
+#define Get_endian( t ) ( (t) & ENDIAN_TYPE )
+#define Set_endian( t ) ( ( (t) & ~ENDIAN_TYPE ) | ARCH_ENDIAN )
+#define Same_endian( t ) ( ( (t) & ENDIAN_TYPE ) == ARCH_ENDIAN )
+#define Clear_endian( t ) ( (t) & ~ENDIAN_TYPE )
#ifndef Flip_int16
-#define Flip_int16( type ) ( ( ((type) >> 8) & 0x00ff) | ( ((type) << 8) & 0xff00) )
+# define Flip_int16( t ) ( ( ((t) >> 8) & 0x00ff) | ( ((t) << 8) & 0xff00) )
#endif
#ifndef Flip_int32
-#define Flip_int32( type ) ( ( ((type) >>24) & 0x000000ff) | ( ((type) >> 8) & 0x0000ff00) | ( ((type) << 8) & 0x00ff0000) | ( ((type) <<24) & 0xff000000) )
+# define Flip_int32( t ) ( ( ((t) >> 24) & 0x000000ff) | ( ((t) >> 8) & 0x0000ff00) | ( ((t) << 8) & 0x00ff0000) | ( ((t) << 24) & 0xff000000) )
#endif
#ifndef Flip_int64
-#define Flip_int64( type ) ( \
- (((type) & ((int64_t) 0xff << 0)) << 56) | (((type) & ((int64_t) 0xff << 8)) << 40) | \
- (((type) & ((int64_t) 0xff << 16)) << 24) | (((type) & ((int64_t) 0xff << 24)) << 8) | \
- (((type) & ((int64_t) 0xff << 32)) >> 8) | (((type) & ((int64_t) 0xff << 40)) >> 24) | \
- (((type) & ((int64_t) 0xff << 48)) >> 40) | (((type) & ((int64_t) 0xff << 56)) >> 56) )
+# define Flip_int64( t ) ( \
+ (((t) & ((int64_t) 0xff << 0)) << 56) | (((t) & ((int64_t) 0xff << 8)) << 40) | \
+ (((t) & ((int64_t) 0xff << 16)) << 24) | (((t) & ((int64_t) 0xff << 24)) << 8) | \
+ (((t) & ((int64_t) 0xff << 32)) >> 8) | (((t) & ((int64_t) 0xff << 40)) >> 24) | \
+ (((t) & ((int64_t) 0xff << 48)) >> 40) | (((t) & ((int64_t) 0xff << 56)) >> 56) )
#endif
-#define channel int
-#define mailbox int
+#define channel int
+#define mailbox int
-typedef struct dummy_membership_id {
- int32 proc_id;
- int32 time;
+typedef struct dummy_membership_id {
+ int32 proc_id;
+ int32 time;
} membership_id;
-typedef struct dummy_group_id {
- membership_id memb_id;
- int32 index;
+typedef struct dummy_group_id {
+ membership_id memb_id;
+ int32 index;
} group_id;
/*
@@ -278,10 +280,11 @@
#endif
#ifndef TRUE
-#define TRUE 1
+# define TRUE 1
#endif
+
#ifndef FALSE
-#define FALSE 0
+# define FALSE 0
#endif
-#endif /* INC_ARCH */
+#endif /* INC_ARCH */
Modified: trunk/libspread-util/src/data_link.c
===================================================================
--- trunk/libspread-util/src/data_link.c 2014-01-22 03:45:18 UTC (rev 670)
+++ trunk/libspread-util/src/data_link.c 2014-01-22 06:17:58 UTC (rev 671)
@@ -34,69 +34,66 @@
#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+
#include "arch.h"
-#ifndef ARCH_PC_WIN95
+#ifndef ARCH_PC_WIN95
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <netinet/in.h>
+# include <arpa/inet.h>
+# include <sys/uio.h>
+# include <sys/time.h>
+# include <unistd.h>
+#else
+# include <winsock.h>
+#endif
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/uio.h>
-/* for select */
-#include <sys/time.h>
-#include <unistd.h>
-
-#include <errno.h>
-#else /* ARCH_PC_WIN95 */
-
-#include <winsock.h>
-
-#endif /* ARCH_PC_WIN95 */
-
-#include <string.h>
-#include <assert.h>
#include "spu_data_link.h"
#include "spu_alarm.h"
#include "spu_events.h" /* for sp_time */
+#define DL_MAX_NUM_SEND_RETRIES 1
-channel DL_init_channel( int32 channel_type, int16 port, int32 mcast_address, int32 interface_address )
+channel DL_init_channel( int32 channel_type, int16 port, int32 mcast_address, int32 interface_address )
{
- channel chan;
- struct sockaddr_in soc_addr;
- int on=1, off=0;
-#ifdef IP_MULTICAST_TTL
- unsigned char ttl_val;
+ channel chan;
+ struct sockaddr_in soc_addr;
+ int on=1, off=0;
+#ifdef IP_MULTICAST_TTL
+ unsigned char ttl_val;
#endif
- if((chan = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
- Alarm( EXIT, "DL_init_channel: socket error for port %d\n", port );
+ if((chan = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+ Alarm( EXIT, "DL_init_channel: socket error for port %d\n", port );
- if ( channel_type & SEND_CHANNEL )
- {
- if (setsockopt(chan, SOL_SOCKET, SO_BROADCAST, (char *)&on,
- sizeof(on)) < 0)
- Alarm( EXIT, "DL_init_channel: setsockopt error for port %d\n",port);
- Alarm( DATA_LINK, "DL_init_channel: setsockopt for send and broadcast went ok\n");
+ if ( channel_type & SEND_CHANNEL )
+ {
+ if (setsockopt(chan, SOL_SOCKET, SO_BROADCAST, (char *)&on,
+ sizeof(on)) < 0)
+ Alarm( EXIT, "DL_init_channel: setsockopt error for port %d\n",port);
+ Alarm( DATA_LINK, "DL_init_channel: setsockopt for send and broadcast went ok\n");
-#ifdef IP_MULTICAST_TTL
- /* ### Isn't this for sending??? */
- ttl_val = 1;
- if (setsockopt(chan, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&ttl_val,
- sizeof(ttl_val)) < 0)
- {
- Alarm( DATA_LINK, "DL_init_channel: problem in setsockopt of multicast ttl %d - ignore in WinNT or Win95\n", ttl_val );
- }
- Alarm( DATA_LINK, "DL_init_channel: setting Mcast TTL to %d\n",ttl_val);
+#ifdef IP_MULTICAST_TTL
+ /* ### Isn't this for sending??? */
+ ttl_val = 1;
+ if (setsockopt(chan, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&ttl_val,
+ sizeof(ttl_val)) < 0)
+ {
+ Alarm( DATA_LINK, "DL_init_channel: problem in setsockopt of multicast ttl %d - ignore in WinNT or Win95\n", ttl_val );
+ }
+ Alarm( DATA_LINK, "DL_init_channel: setting Mcast TTL to %d\n",ttl_val);
#endif
- }
+ }
- if ( channel_type & RECV_CHANNEL )
- {
+ if ( channel_type & RECV_CHANNEL )
+ {
memset(&soc_addr, 0, sizeof(soc_addr));
- soc_addr.sin_family = AF_INET;
- soc_addr.sin_port = htons(port);
+ 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);
@@ -128,65 +125,65 @@
}
- if(bind( chan, (struct sockaddr *) &soc_addr,
- sizeof(soc_addr)) == -1)
- {
- Alarm( EXIT, "DL_init_channel: bind error (%d): %s for port %d, with sockaddr (" IPF ": %d) probably already running\n", sock_errno, sock_strerror(sock_errno), port, IP_NET(soc_addr.sin_addr.s_addr), ntohs(soc_addr.sin_port));
- }
- Alarm( DATA_LINK, "DL_init_channel: bind for recv_channel for " IPF " port %d with chan %d ok\n",
- IP_NET(soc_addr.sin_addr.s_addr), port, chan);
+ if(bind( chan, (struct sockaddr *) &soc_addr,
+ sizeof(soc_addr)) == -1)
+ {
+ Alarm( EXIT, "DL_init_channel: bind error (%d): %s for port %d, with sockaddr (" IPF ": %d) probably already running\n", sock_errno, sock_strerror(sock_errno), port, IP_NET(soc_addr.sin_addr.s_addr), ntohs(soc_addr.sin_port));
+ }
+ Alarm( DATA_LINK, "DL_init_channel: bind for recv_channel for " IPF " port %d with chan %d ok\n",
+ IP_NET(soc_addr.sin_addr.s_addr), port, chan);
- if( IS_MCAST_ADDR(mcast_address) )
- {
+ if( IS_MCAST_ADDR(mcast_address) )
+ {
#ifdef IP_MULTICAST_TTL
- struct ip_mreq mreq;
+ struct ip_mreq mreq;
- mreq.imr_multiaddr.s_addr = htonl( mcast_address );
+ mreq.imr_multiaddr.s_addr = htonl( mcast_address );
- /* the interface could be changed to a specific interface if needed */
+ /* the interface could be changed to a specific interface if needed */
/* WAS: mreq.imr_interface.s_addr = INADDR_ANY;
* If specified, then want to route through it instead of
* based on routing decisions at the kernel */
- /* IP_ADD_MEMBERSHIP requires that the imr_interface be an actual physical interface
- * or INADDR_ANY. So if this is the special case of binding to multicast or broadcast,
- * switch the join to use INADDR_ANY. In the case when the passed in interface
- * is a regular physical interface, then join only on that one.
- */
- if ( IS_MCAST_ADDR(interface_address) )
- mreq.imr_interface.s_addr = htonl( INADDR_ANY );
- else
- mreq.imr_interface.s_addr = htonl( interface_address );
+ /* IP_ADD_MEMBERSHIP requires that the imr_interface be an actual physical interface
+ * or INADDR_ANY. So if this is the special case of binding to multicast or broadcast,
+ * switch the join to use INADDR_ANY. In the case when the passed in interface
+ * is a regular physical interface, then join only on that one.
+ */
+ if ( IS_MCAST_ADDR(interface_address) )
+ mreq.imr_interface.s_addr = htonl( INADDR_ANY );
+ else
+ mreq.imr_interface.s_addr = htonl( interface_address );
- if (setsockopt(chan, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *)&mreq,
- sizeof(mreq)) < 0)
- {
- Alarm( EXIT, "DL_init_channel: problem (errno %d:%s) in setsockopt to multicast address " IPF "\n", sock_errno, sock_strerror(sock_errno), IP(mcast_address) );
- }
+ if (setsockopt(chan, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *)&mreq,
+ sizeof(mreq)) < 0)
+ {
+ Alarm( EXIT, "DL_init_channel: problem (errno %d:%s) in setsockopt to multicast address " IPF "\n", sock_errno, sock_strerror(sock_errno), IP(mcast_address) );
+ }
if ( channel_type & NO_LOOP )
{
if (setsockopt(chan, IPPROTO_IP, IP_MULTICAST_LOOP,
(void *)&off, 1) < 0)
{
- Alarm( EXIT, "DL_init_channel: problem (errno %d:%s) in setsockopt loop setting " IPF "\n", sock_errno, sock_strerror(sock_errno), IP(mcast_address));
+ Alarm( EXIT, "DL_init_channel: problem (errno %d:%s) in setsockopt loop setting " IPF "\n", sock_errno, sock_strerror(sock_errno), IP(mcast_address));
}
- }
+ }
- Alarm( DATA_LINK, "DL_init_channel: Joining multicast address " IPF " went ok\n", IP(mcast_address) );
-#else /* no multicast support */
- Alarm( EXIT, "DL_init_channel: Old SunOS architecture does not support IP multicast: " IPF "\n", IP(mcast_address));
+ Alarm( DATA_LINK, "DL_init_channel: Joining multicast address " IPF " went ok\n", IP(mcast_address) );
+#else /* no multicast support */
+ Alarm( EXIT, "DL_init_channel: Old SunOS architecture does not support IP multicast: " IPF "\n", IP(mcast_address));
#endif
- } else {
+ } else {
if (setsockopt(chan, SOL_SOCKET, SO_BROADCAST, (char *)&on,
sizeof(on)) < 0)
- Alarm( EXIT, "DL_init_channel: setsockopt SO_BROADCAST error for port %d, socket %d\n",port,chan);
+ Alarm( EXIT, "DL_init_channel: setsockopt SO_BROADCAST error for port %d, socket %d\n",port,chan);
Alarm( DATA_LINK, "DL_init_channel: setsockopt for recv and broadcast went ok\n");
}
- }
+ }
- Alarm( DATA_LINK, "DL_init_channel: went ok on channel %d\n",chan);
- return ( chan );
+ Alarm( DATA_LINK, "DL_init_channel: went ok on channel %d\n",chan);
+ return ( chan );
}
void DL_close_channel(channel chan)
@@ -198,178 +195,172 @@
}
}
-int DL_send( channel chan, int32 address, int16 port, sys_scatter *scat )
-{
+int DL_send( channel chan, int32 address, int16 port, sys_scatter *scat )
+{
#ifndef ARCH_SCATTER_NONE
- struct msghdr msg;
-#else /* ARCH_SCATTER_NONE */
- char pseudo_scat[MAX_PACKET_SIZE];
-#endif /* ARCH_SCATTER_NONE */
-
- struct sockaddr_in soc_addr;
- struct timeval select_delay = { 0, 10000 };
- int ret;
- int total_len;
- int i;
- int num_try;
- char *send_errormsg = NULL; /* fool compiler */
+ struct msghdr msg;
+#else
+ char pseudo_scat[MAX_PACKET_SIZE];
+#endif
+
+ struct sockaddr_in soc_addr;
+ struct timeval select_delay;
+ int ret;
+ int total_len;
+ int i;
+ int num_try;
/* Check that the scatter passed is small enough to be a valid system scatter */
- assert(scat->num_elements <= ARCH_SCATTER_SIZE);
- memset(&soc_addr, 0, sizeof(soc_addr));
- soc_addr.sin_family = AF_INET;
- soc_addr.sin_addr.s_addr= htonl(address);
- soc_addr.sin_port = htons(port);
+ if( scat->num_elements > ARCH_SCATTER_SIZE ) {
+ Alarmp( SPLOG_FATAL, DATA_LINK, "DL_send: illegal scat->num_elements (%d) > ARCH_SCATTER_SIZE (%d)\n",
+ (int) scat->num_elements, (int) ARCH_SCATTER_SIZE );
+ }
+ memset( &soc_addr, 0, sizeof( soc_addr ) );
+ soc_addr.sin_family = AF_INET;
+ 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);
+ soc_addr.sin_len = sizeof( soc_addr );
#endif
#ifdef ARCH_PC_HOME
- soc_addr.sin_addr.s_addr= htonl(-1073741814);
-#endif /* ARCH_PC_HOME */
+ soc_addr.sin_addr.s_addr = htonl( -1073741814 ); /* WTF? */
+#endif
#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;
- msg.msg_iovlen = scat->num_elements;
-#endif /* 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;
+ msg.msg_iovlen = scat->num_elements;
+#endif
-#ifdef ARCH_SCATTER_CONTROL
- msg.msg_controllen = 0;
-#endif /* ARCH_SCATTER_CONTROL */
-#ifdef ARCH_SCATTER_ACCRIGHTS
- msg.msg_accrightslen = 0;
-#endif /* ARCH_SCATTER_ACCRIGHTS */
+ for( i = 0, total_len = 0; i < (int) scat->num_elements; ++i ) {
- for( i=0, total_len=0; i < (int) scat->num_elements; i++)
- {
-#ifdef ARCH_SCATTER_NONE
- memcpy( &pseudo_scat[total_len], scat->elements[i].buf,
- scat->elements[i].len );
-#endif /* ARCH_SCATTER_NONE */
- total_len+=scat->elements[i].len;
- }
-#if 0
-#ifndef ARCH_SCATTER_NONE
- if( msg.msg_iovlen > 16)
- {
- Alarm(EXIT, "Too Big iovec of size %d\n", msg.msg_iovlen);
+#ifdef ARCH_SCATTER_NONE
+ memcpy( &pseudo_scat[total_len], scat->elements[i].buf, scat->elements[i].len );
+#endif
+ total_len += scat->elements[i].len;
}
+
+ for( num_try = 1;; ++num_try ) {
+
+#ifndef ARCH_SCATTER_NONE
+ ret = sendmsg( chan, &msg, 0 );
+#else
+ ret = sendto( chan, pseudo_scat, total_len, 0, (struct sockaddr *) &soc_addr, sizeof( soc_addr ) );
#endif
-#endif
- for( ret=-10, num_try=0; ret < 0 && num_try < 10; num_try++ )
- {
-#ifndef ARCH_SCATTER_NONE
- ret = sendmsg(chan, &msg, 0);
-#else /* ARCH_SCATTER_NONE */
- ret = sendto(chan, pseudo_scat, total_len, 0,
- (struct sockaddr *)&soc_addr, sizeof(soc_addr) );
-#endif /* ARCH_SCATTER_NONE */
- if(ret < 0) {
- /* delay for a short while */
- send_errormsg = sock_strerror(sock_errno);
- Alarm( DATA_LINK, "DL_send: delaying after failure in send to " IPF ", ret is %d\n", IP(address), ret);
- select( 0, 0, 0, 0, &select_delay );
- select_delay.tv_sec = 0;
- select_delay.tv_usec = 10000;
- }
- }
- if (ret < 0)
- {
- for( i=0; i < (int) scat->num_elements; i++)
- Alarm( DATA_LINK, "DL_send: element[%d]: %d bytes\n",
- i,scat->elements[i].len);
- Alarm( DATA_LINK, "DL_send: error: %s\n sending %d bytes on channel %d to address " IPF "\n",
- send_errormsg, total_len,chan,IP(address) );
- }else if(ret < total_len){
- Alarm( DATA_LINK, "DL_send: partial sending %d out of %d\n",
- ret,total_len);
- }
- Alarm( DATA_LINK, "DL_send: sent a message of %d bytes to (" IPF ":%d) on channel %d\n",
- ret,IP(address),port,chan);
- return(ret);
+ if( ret >= 0 || num_try > DL_MAX_NUM_SEND_RETRIES ) { break; } /* success or give up */
+
+ /* delay for a short while */
+
+ select_delay.tv_sec = 0;
+ select_delay.tv_usec = 100;
+
+ Alarmp( SPLOG_WARNING, DATA_LINK, "DL_send: delaying for %ld.%06lds after failed send to (" IPF ":%d): %d %d '%s'\n",
+ select_delay.tv_sec, select_delay.tv_usec, IP(address), port, ret, sock_errno, sock_strerror(sock_errno) );
+
+ select( 0, NULL, NULL, NULL, &select_delay );
+
+ Alarmp( SPLOG_WARNING, DATA_LINK, "DL_send: woke up; about to attempt send retry #%d\n", num_try );
+ }
+
+ if( ret < 0 ) {
+
+ Alarmp( SPLOG_WARNING, DATA_LINK, "DL_send: error: %d %d '%s'\n", ret, sock_errno, sock_strerror(sock_errno) );
+
+ for( i = 0; i < (int) scat->num_elements; ++i ) {
+ Alarmp( SPLOG_WARNING, DATA_LINK, "DL_send: element[%d]: %d bytes\n", i, (int) scat->elements[i].len );
+ }
+
+ } else if( ret < total_len ) {
+
+ Alarmp( SPLOG_WARNING, DATA_LINK, "DL_send: partial sending %d out of %d\n", ret, total_len );
+
+ } else if( ret != total_len ) {
+
+ Alarmp( SPLOG_WARNING, DATA_LINK, "DL_send: unexpected return (%d) > total_len (%d)?!\n", ret, total_len );
+ }
+
+ Alarmp( SPLOG_INFO, DATA_LINK, "DL_send: ret = %d, sending a message of %d bytes to (" IPF ":%d) on channel %d\n",
+ ret, total_len, IP(address), port, chan );
+
+ return( ret );
}
-int DL_recv( channel chan, sys_scatter *scat )
+int DL_recv( channel chan, sys_scatter *scat )
{
- int ret;
- ret = DL_recvfrom( chan, scat, NULL, NULL );
-
- return(ret);
+ return( DL_recvfrom( chan, scat, NULL, NULL ) );
}
-int DL_recvfrom( channel chan, sys_scatter *scat, int *src_address, unsigned short *src_port )
+int DL_recvfrom( channel chan, sys_scatter *scat, int *src_address, unsigned short *src_port )
{
#ifndef ARCH_SCATTER_NONE
-static struct msghdr msg;
-#else /* ARCH_SCATTER_NONE */
-static char pseudo_scat[MAX_PACKET_SIZE];
- int bytes_to_copy;
- int total_len;
- int start;
- int i;
-#endif /* ARCH_SCATTER_NONE */
+static struct msghdr msg;
+#else
+static char pseudo_scat[MAX_PACKET_SIZE];
+ int bytes_to_copy;
+ int total_len;
+ int start;
+ int i;
+#endif
+
struct sockaddr_in source_address;
int sip;
unsigned short sport;
socklen_t sa_len;
- int ret;
+ int ret;
/* check the scat is small enough to be a sys_scatter */
- assert(scat->num_elements <= ARCH_SCATTER_SIZE);
+ if( scat->num_elements > ARCH_SCATTER_SIZE ) {
+ Alarmp( SPLOG_FATAL, DATA_LINK, "DL_recvfrom: illegal scat->num_elements (%d) > ARCH_SCATTER_SIZE (%d)\n",
+ (int) scat->num_elements, (int) ARCH_SCATTER_SIZE );
+ }
+
#ifndef ARCH_SCATTER_NONE
- msg.msg_name = (caddr_t) &source_address;
- msg.msg_namelen = sizeof(source_address);
- msg.msg_iov = (struct iovec *)scat->elements;
- msg.msg_iovlen = scat->num_elements;
-#endif /* ARCH_SCATTER_NONE */
+ memset( &msg, 0, sizeof( msg ) );
+ msg.msg_name = (caddr_t) &source_address;
+ msg.msg_namelen = sizeof( source_address );
+ msg.msg_iov = (struct iovec *) scat->elements;
+ msg.msg_iovlen = scat->num_elements;
+#endif
-#ifdef ARCH_SCATTER_CONTROL
- msg.msg_control = (caddr_t) 0;
- msg.msg_controllen = 0;
-#endif /* ARCH_SCATTER_CONTROL */
-#ifdef ARCH_SCATTER_ACCRIGHTS
- msg.msg_accrights = (caddr_t) 0;
- msg.msg_accrightslen = 0;
-#endif /* ARCH_SCATTER_ACCRIGHTS */
-
#ifndef ARCH_SCATTER_NONE
- ret = recvmsg( chan, &msg, 0 );
+ ret = recvmsg( chan, &msg, 0 );
sa_len = msg.msg_namelen;
-#else /* ARCH_SCATTER_NONE */
+#else
- total_len = 0; /*This is for TCP, to not receive*/
- for(i=0; i < (int) scat->num_elements; i++) /*more than one packet. */
- total_len += scat->elements[i].len;
+ total_len = 0;
+ for( i=0; i < (int) scat->num_elements; ++i )
+ total_len += scat->elements[i].len;
- if(total_len>MAX_PACKET_SIZE)
+ if( total_len > MAX_PACKET_SIZE ) /* this is for TCP, to not receive more than one packet */
total_len = MAX_PACKET_SIZE;
sa_len = sizeof(source_address);
- ret = recvfrom( chan, pseudo_scat, total_len, 0, (struct sockaddr *) &source_address, &sa_len);
-
- for( i=0, total_len = ret, start =0; total_len > 0; i++)
- {
- bytes_to_copy = scat->elements[i].len;
- if( bytes_to_copy > total_len ) bytes_to_copy = total_len;
- memcpy( scat->elements[i].buf, &pseudo_scat[start],
+ ret = recvfrom( chan, pseudo_scat, total_len, 0, (struct sockaddr *) &source_address, &sa_len);
+
+ for( i=0, total_len = ret, start =0; total_len > 0; i++)
+ {
+ bytes_to_copy = scat->elements[i].len;
+ if( bytes_to_copy > total_len ) bytes_to_copy = total_len;
+ memcpy( scat->elements[i].buf, &pseudo_scat[start],
bytes_to_copy );
- total_len-= scat->elements[i].len;
- start += scat->elements[i].len;
- }
-#endif /* ARCH_SCATTER_NONE */
- if (ret < 0)
- {
- Alarm( DATA_LINK, "DL_recv: error %d receiving on channel %d\n", ret, chan );
- return( -1 );
- }
+ total_len-= scat->elements[i].len;
+ start += scat->elements[i].len;
+ }
+#endif /* ARCH_SCATTER_NONE */
+ if (ret < 0)
+ {
+ Alarm( DATA_LINK, "DL_recv: error %d receiving on channel %d\n", ret, chan );
+ return( -1 );
+ }
#ifdef ARCH_SCATTER_CONTROL
else if (ret == 0)
{
@@ -419,8 +410,8 @@
*src_port = sport;
Alarm( DATA_LINK, "\tfrom (" IPF ") with family %d port %d\n", IP(sip), source_address.sin_family, sport );
}
- Alarm( DATA_LINK, "DL_recv: received %d bytes on channel %d\n",
- ret, chan );
+ Alarm( DATA_LINK, "DL_recv: received %d bytes on channel %d\n",
+ ret, chan );
- return(ret);
+ return(ret);
}
More information about the Spread-cvs
mailing list