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

Modified Files:
        client.c playerc.h 
Log Message:
added reconnect logic to libplayerc, and appropriate methods to libplayerc++

Index: client.c
===================================================================
RCS file: /cvsroot/playerstage/code/player/client_libs/libplayerc/client.c,v
retrieving revision 1.70
retrieving revision 1.71
diff -C2 -d -r1.70 -r1.71
*** client.c    6 Sep 2006 15:15:38 -0000       1.70
--- client.c    13 Sep 2006 18:40:16 -0000      1.71
***************
*** 72,75 ****
--- 72,76 ----
  // Player message structure for subscibing to devices.  This one is
  // easier to use than the one defined in messages.h.
+ /*
  typedef struct
  {
***************
*** 79,82 ****
--- 80,84 ----
    uint8_t access;
  } __attribute__ ((packed)) playerc_msg_subscribe_t;
+ */
  
  
***************
*** 162,165 ****
--- 164,170 ----
    client->request_timeout = 5.0;
  
+   client->retry_limit = 0;
+   client->retry_time = 2.0;
+ 
    return client;
  }
***************
*** 304,307 ****
--- 309,375 ----
  }
  
+ // Disconnect from the server, with potential retry
+ int playerc_client_disconnect_retry(playerc_client_t *client)
+ {
+   int retval;
+   int i;
+   int j;
+ 
+   /* Disconnect */
+   if((retval = playerc_client_disconnect(client)) != 0)
+     PLAYER_WARN("playerc_client_disconnect() failed");
+ 
+   for(j=0; (client->retry_limit < 0) || (j<client->retry_limit); j++)
+   {
+     PLAYER_WARN1("Reconnecting, attempt %d", j);
+     /* Reconnect */
+     if((retval = playerc_client_connect(client)) != 0)
+       PLAYER_WARN("playerc_client_connect() failed");
+     else
+     {
+       /* Clean out buffers */
+       client->read_xdrdata_len = 0;
+       
+       /* TODO: re-establish replacement rules, delivery modes, etc. */
+ 
+       /* Re-subscribe to devices */
+       for(i=0;i<client->device_count;i++)
+       {
+         if(client->device[i]->subscribed)
+         {
+           // TODO: what should access be here?
+           if((retval = playerc_device_subscribe(client->device[i],
+                                                 PLAYERC_OPEN_MODE)) != 0)
+           {
+             PLAYER_WARN2("playerc_device_subscribe() failed for %d:%d",
+                          client->device[i]->addr.interf,
+                          client->device[i]->addr.index);
+ 
+             // TODO: Subscription failed for one device; should we give up?
+             if(playerc_client_disconnect(client) != 0)
+               PLAYER_WARN("playerc_client_disconnect() failed");
+             break;
+           }
+         }
+       }
+       // Did we get all of them?
+       if(i == client->device_count)
+         break;
+     }
+ 
+     usleep((uint)rint(client->retry_time * 1e6));
+   }
+ 
+   if((client->retry_limit < 0) || (j < client->retry_limit))
+   {
+     PLAYER_WARN("successfully reconnected");
+     return(0);
+   }
+   else
+   {
+     PLAYER_WARN("failed to reconnect");
+     return(-1);
+   }
+ }
  
  // Disconnect from the server
***************
*** 789,793 ****
        PLAYERC_ERR1("recv failed with error [%s]", strerror(errno));
        //playerc_client_disconnect(client);
!       return -1;
      }
      client->read_xdrdata_len += nbytes;
--- 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;
***************
*** 1034,1035 ****
--- 1103,1115 ----
  }
  
+ //  Set the retry limit
+ void playerc_client_set_retry_limit(playerc_client_t* client, int limit)
+ {
+   client->retry_limit = limit;
+ }
+ 
+ //  Set the retry time
+ void playerc_client_set_retry_time(playerc_client_t* client, double time)
+ {
+   client->retry_time = time;
+ }

Index: playerc.h
===================================================================
RCS file: /cvsroot/playerstage/code/player/client_libs/libplayerc/playerc.h,v
retrieving revision 1.207
retrieving revision 1.208
diff -C2 -d -r1.207 -r1.208
*** playerc.h   11 Sep 2006 19:57:37 -0000      1.207
--- playerc.h   13 Sep 2006 18:40:16 -0000      1.208
***************
*** 453,456 ****
--- 453,465 ----
    struct sockaddr_in server;
  
+   /** How many times we'll try to reconnect after a socket error.  Use @ref
+    * playerc_client_set_retry_limit() to set this value. Set to -1 for
+    * infinite retry. */
+   int retry_limit;
+ 
+   /** How long to sleep, in seconds, to sleep between reconnect attempts.
+    * Use @ref playerc_client_set_retry_time() to set this value. */
+   double retry_time;
+ 
    /** @internal Socket descriptor */
    int sock;
***************
*** 541,544 ****
--- 550,561 ----
  int playerc_client_disconnect(playerc_client_t *client);
  
+ /** @brief Disconnect from the server, with potential retry. @internal
+ 
+ @param client Pointer to client object.
+ 
+ @returns Returns 0 on success, non-zero otherwise.
+ */
+ int playerc_client_disconnect_retry(playerc_client_t *client);
+ 
  /** @brief Change the server's data delivery mode.
  
***************
*** 691,694 ****
--- 708,726 ----
  void playerc_client_set_request_timeout(playerc_client_t* client, uint 
seconds);
  
+ /** @brief Set the connection retry limit.
+ 
+ @param client Pointer to the client object
+ @param limit The number of times to attempt to reconnect to the server.  Give 
-1 for 
+        infinite retry.
+ */
+ void playerc_client_set_retry_limit(playerc_client_t* client, int limit);
+ 
+ /** @brief Set the connection retry sleep time.
+ 
+ @param client Pointer to the client object
+ @param time The amount of time, in seconds, to sleep between reconnection 
attempts.
+ */
+ void playerc_client_set_retry_time(playerc_client_t* client, double time);
+ 
  /** @brief Write data to the server.  @internal
  */


-------------------------------------------------------------------------
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