Update of /cvsroot/playerstage/code/player/client_libs/libplayerc
In directory 
sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28606/client_libs/libplayerc

Modified Files:
        client.c 
Log Message:
filled out connection retry logic in libplayerc

Index: client.c
===================================================================
RCS file: /cvsroot/playerstage/code/player/client_libs/libplayerc/client.c,v
retrieving revision 1.71
retrieving revision 1.72
diff -C2 -d -r1.71 -r1.72
*** client.c    13 Sep 2006 18:40:16 -0000      1.71
--- client.c    13 Sep 2006 23:59:40 -0000      1.72
***************
*** 51,54 ****
--- 51,55 ----
  #include <unistd.h>
  #include <sys/types.h>
+ #include <signal.h>
  #include <netinet/in.h>
  #include <sys/socket.h>
***************
*** 82,85 ****
--- 83,90 ----
  */
  
+ void dummy(int sig)
+ {
+   printf("got %d\n", sig);
+ }
  
  // Local functions
***************
*** 197,204 ****
    int old_flags;
    int ret;
!   double t;
    struct timeval last;
    struct timeval curr;
    struct sockaddr_in clientaddr;
  
    // Construct socket
--- 202,213 ----
    int old_flags;
    int ret;
!   //double t;
!   /*
    struct timeval last;
    struct timeval curr;
+   */
+   struct itimerval timer;
    struct sockaddr_in clientaddr;
+   struct sigaction sigact;
  
    // Construct socket
***************
*** 248,253 ****
    memcpy(&client->server.sin_addr, entp->h_addr_list[0], entp->h_length);
    client->server.sin_port = htons(client->port);
! 
    // Connect the socket
    t = client->request_timeout;
    do
--- 257,263 ----
    memcpy(&client->server.sin_addr, entp->h_addr_list[0], entp->h_length);
    client->server.sin_port = htons(client->port);
!   
    // Connect the socket
+   /*
    t = client->request_timeout;
    do
***************
*** 260,263 ****
--- 270,274 ----
      }
      gettimeofday(&last,NULL);
+     puts("calling connect");
      ret = connect(client->sock, (struct sockaddr*)&client->server, 
                    sizeof(client->server));
***************
*** 266,269 ****
--- 277,325 ----
            (last.tv_sec + last.tv_usec/1e6));
    } while (ret == -1 && (errno == EALREADY || errno == EAGAIN || errno == 
EINPROGRESS));
+   */
+ 
+   /* Set up a timer to interrupt the connection process */
+   timer.it_interval.tv_sec = 0;
+   timer.it_interval.tv_usec = 0;
+   timer.it_value.tv_sec = (int)floor(client->request_timeout);
+   timer.it_value.tv_usec = 
+           (int)rint(fmod(client->request_timeout,timer.it_value.tv_sec)*1e6);
+   if(setitimer(ITIMER_REAL, &timer, NULL) != 0)
+     PLAYER_WARN("failed to set up connection timer; "
+                 "indefinite hang may result");
+ 
+   /* Turn off system call restart so that connect() will terminate when the
+    * alarm goes off */
+   if(sigaction(SIGALRM, NULL, &sigact) != 0)
+     PLAYER_WARN("failed to get SIGALRM action data; "
+                 "unexpected exit may result");
+   else
+   {
+     sigact.sa_handler = dummy;
+     sigact.sa_flags &= ~SA_RESTART;
+     if(sigaction(SIGALRM, &sigact, NULL) != 0)
+       PLAYER_WARN("failed to set SIGALRM action data; "
+                   "unexpected exit may result");
+   }
+ 
+   puts("calling connect");
+   ret = connect(client->sock, (struct sockaddr*)&client->server, 
+                 sizeof(client->server));
+   puts("done");
+ 
+   /* Turn off timer */
+   timer.it_value.tv_sec = 0;
+   timer.it_value.tv_usec = 0;
+   if(setitimer(ITIMER_REAL, &timer, NULL) != 0)
+     PLAYER_WARN("failed to turn off connection timer; "
+                 "unexpected exit may result");
+ 
+   /* Restore normal SIGALRM behavior */
+   sigact.sa_handler = SIG_DFL;
+   sigact.sa_flags |= SA_RESTART;
+   if(sigaction(SIGALRM, &sigact, NULL) != 0)
+     PLAYER_WARN("failed to reset SIGALRM action data; "
+                 "unexpected behavior may result");
+ 
    if (ret < 0)
    {
***************
*** 298,302 ****
    
    // Get the banner
!   if (timed_recv(client->sock, banner, sizeof(banner), 0, 30000) < 
sizeof(banner))
    {
      playerc_client_disconnect(client);
--- 354,358 ----
    
    // Get the banner
!   if (timed_recv(client->sock, banner, sizeof(banner), 0, 2000) < 
sizeof(banner))
    {
      playerc_client_disconnect(client);
***************
*** 328,331 ****
--- 384,388 ----
      else
      {
+       puts("playerc_client_connect() succeeded");
        /* Clean out buffers */
        client->read_xdrdata_len = 0;
***************
*** 358,361 ****
--- 415,419 ----
      }
  
+     puts("sleeping");
      usleep((uint)rint(client->retry_time * 1e6));
    }
***************
*** 462,466 ****
      PLAYERC_ERR1("poll returned error [%s]", strerror(errno));
      //playerc_client_disconnect(client);
!     return -1;
    }
    if (count > 0 && (fd.revents & POLLHUP))
--- 520,524 ----
      PLAYERC_ERR1("poll returned error [%s]", strerror(errno));
      //playerc_client_disconnect(client);
!     return(playerc_client_disconnect_retry(client));
    }
    if (count > 0 && (fd.revents & POLLHUP))
***************
*** 468,472 ****
      PLAYERC_ERR("socket disconnected");
      //playerc_client_disconnect(client);
!     return -1;
    }
    return count;
--- 526,530 ----
      PLAYERC_ERR("socket disconnected");
      //playerc_client_disconnect(client);
!     return(playerc_client_disconnect_retry(client));
    }
    return count;
***************
*** 857,862 ****
        PLAYERC_ERR1("recv failed with error [%s]", strerror(errno));
        //playerc_client_disconnect(client);
!       if(playerc_client_disconnect_retry(client) != 0)
!         return -1;
      }
      client->read_xdrdata_len += nbytes;
--- 915,922 ----
        PLAYERC_ERR1("recv failed with error [%s]", strerror(errno));
        //playerc_client_disconnect(client);
!       if(playerc_client_disconnect_retry(client) < 0)
!         return(-1);
!       else
!         continue;
      }
      client->read_xdrdata_len += nbytes;
***************
*** 893,897 ****
        PLAYERC_ERR1("recv failed with error [%s]", strerror(errno));
        //playerc_client_disconnect(client);
!       return -1;
      }
      client->read_xdrdata_len += nbytes;
--- 953,964 ----
        PLAYERC_ERR1("recv failed with error [%s]", strerror(errno));
        //playerc_client_disconnect(client);
!       if(playerc_client_disconnect_retry(client) < 0)
!         return(-1);
!       else
!       {
!         /* Need to start over; the easiest way is to recursively call
!          * myself.  Might be problematic... */
!         return(playerc_client_readpacket(client,header,data));
!       }
      }
      client->read_xdrdata_len += nbytes;
***************
*** 1001,1005 ****
        PLAYERC_ERR2("send on body failed with error [%d:%s]", errno, 
strerror(errno));
        //playerc_client_disconnect(client);
!       return -1;
      }
    } while (bytes);
--- 1068,1072 ----
        PLAYERC_ERR2("send on body failed with error [%d:%s]", errno, 
strerror(errno));
        //playerc_client_disconnect(client);
!       return(playerc_client_disconnect_retry(client));
      }
    } while (bytes);


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit

Reply via email to