Browse Source

Cache errno from bad poll call

Brian Aker 13 years ago
parent
commit
c723652dea
3 changed files with 12 additions and 2 deletions
  1. 1 0
      libgearman/connection.cc
  2. 1 0
      libgearman/connection.hpp
  3. 10 2
      libgearman/universal.cc

+ 1 - 0
libgearman/connection.cc

@@ -84,6 +84,7 @@ gearman_connection_st::gearman_connection_st(gearman_universal_st &universal_arg
   events(0),
   revents(0),
   fd(-1),
+  cached_errno(0),
   created_id(0),
   created_id_next(0),
   send_buffer_size(0),

+ 1 - 0
libgearman/connection.hpp

@@ -53,6 +53,7 @@ struct gearman_connection_st
   short events;
   short revents;
   int fd;
+  int cached_errno;
   uint32_t created_id;
   uint32_t created_id_next;
   size_t send_buffer_size;

+ 10 - 2
libgearman/universal.cc

@@ -253,8 +253,8 @@ gearman_return_t gearman_wait(gearman_universal_st& universal)
     return gearman_error(universal, GEARMAN_NO_ACTIVE_FDS, "no active file descriptors");
   }
 
-  int ret;
-  while (1)
+  int ret= 0;
+  while (1 and universal.timeout)
   {
     ret= poll(pfds, x, universal.timeout);
     if (ret == -1)
@@ -280,6 +280,14 @@ gearman_return_t gearman_wait(gearman_universal_st& universal)
     if (con->events == 0)
       continue;
 
+    int err;
+    socklen_t len= sizeof (err);
+    (void)getsockopt(con->fd, SOL_SOCKET, SO_ERROR, &err, &len);
+    if (err)
+    {
+      con->cached_errno= err;
+    }
+
     con->set_revents(pfds[x].revents);
 
     x++;