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