[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