From 8497b29a5a12f8213b617c2478d02c8d1a7a5b3c Mon Sep 17 00:00:00 2001 From: Yoshiyuki Asaba Date: Thu, 26 Apr 2007 05:14:53 +0000 Subject: [PATCH] Retry connect() when it is interrupted by signal. --- pool_connection_pool.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/pool_connection_pool.c b/pool_connection_pool.c index e743e47..cb99d56 100644 --- a/pool_connection_pool.c +++ b/pool_connection_pool.c @@ -368,12 +368,20 @@ int connect_inet_domain_socket(int secondary_backend) (char *) hp->h_addr, hp->h_length); - if (connect(fd, (struct sockaddr *)&addr, len) < 0) + for (;;) { - pool_error("connect_inet_domain_socket: connect() failed: %s",strerror(errno)); - close(fd); - return -1; + if (connect(fd, (struct sockaddr *)&addr, len) < 0) + { + if (errno == EINTR || errno == EAGAIN) + continue; + + pool_error("connect_inet_domain_socket: connect() failed: %s",strerror(errno)); + close(fd); + return -1; + } + break; } + return fd; } @@ -401,11 +409,18 @@ int connect_unix_domain_socket(int secondary_backend) len = sizeof(struct sockaddr_un); - if (connect(fd, (struct sockaddr *)&addr, len) < 0) + for (;;) { - pool_error("connect_unix_domain_socket: connect() failed: %s", strerror(errno)); - close(fd); - return -1; + if (connect(fd, (struct sockaddr *)&addr, len) < 0) + { + if (errno == EINTR || errno == EAGAIN ) + continue; + + pool_error("connect_unix_domain_socket: connect() failed: %s", strerror(errno)); + close(fd); + return -1; + } + break; } pool_debug("connected to postmaster Unix domain socket: %s fd: %d", addr.sun_path, fd); return fd; -- 2.39.5