gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [gnunet] branch master updated: gracefully accept empty FD


From: gnunet
Subject: [GNUnet-SVN] [gnunet] branch master updated: gracefully accept empty FD set that claim to contain FDs
Date: Wed, 10 Jan 2018 23:15:17 +0100

This is an automated email from the git hooks/post-receive script.

lurchi pushed a commit to branch master
in repository gnunet.

The following commit(s) were added to refs/heads/master by this push:
     new 67bb148ac gracefully accept empty FD set that claim to contain FDs
67bb148ac is described below

commit 67bb148acd0de26403e4dd89659efeec8889a2c5
Author: lurchi <address@hidden>
AuthorDate: Wed Jan 10 23:14:55 2018 +0100

    gracefully accept empty FD set that claim to contain FDs
---
 src/util/scheduler.c | 92 +++++++++++++++++++++++++++-------------------------
 1 file changed, 48 insertions(+), 44 deletions(-)

diff --git a/src/util/scheduler.c b/src/util/scheduler.c
index df43fdbee..279a4ed02 100644
--- a/src/util/scheduler.c
+++ b/src/util/scheduler.c
@@ -1746,58 +1746,62 @@ GNUNET_SCHEDULER_add_select (enum 
GNUNET_SCHEDULER_Priority prio,
                              void *task_cls)
 {
   struct GNUNET_SCHEDULER_Task *t;
-  const struct GNUNET_NETWORK_Handle **read_nhandles;
-  const struct GNUNET_NETWORK_Handle **write_nhandles;
-  const struct GNUNET_DISK_FileHandle **read_fhandles;
-  const struct GNUNET_DISK_FileHandle **write_fhandles;
-  unsigned int read_nhandles_len, write_nhandles_len,
-               read_fhandles_len, write_fhandles_len;
-  
+  const struct GNUNET_NETWORK_Handle **read_nhandles = NULL;
+  const struct GNUNET_NETWORK_Handle **write_nhandles = NULL;
+  const struct GNUNET_DISK_FileHandle **read_fhandles = NULL;
+  const struct GNUNET_DISK_FileHandle **write_fhandles = NULL;
+  unsigned int read_nhandles_len = 0;
+  unsigned int write_nhandles_len = 0;
+  unsigned int read_fhandles_len = 0;
+  unsigned int write_fhandles_len = 0;
+
+  /* scheduler must be running */
+  GNUNET_assert (NULL != scheduler_driver);
+  GNUNET_assert (NULL != active_task);
+  GNUNET_assert (NULL != task);
   int no_rs = (NULL == rs);
   int no_ws = (NULL == ws);
   int empty_rs = (NULL != rs) && (0 == rs->nsds);
   int empty_ws = (NULL != ws) && (0 == ws->nsds);
-  int no_socket_descriptors = (no_rs && no_ws) ||
-                              (empty_rs && empty_ws) ||
-                              (no_rs && empty_ws) ||
-                              (no_ws && empty_rs);
-  if (no_socket_descriptors)
+  int no_fds = (no_rs && no_ws) ||
+               (empty_rs && empty_ws) ||
+               (no_rs && empty_ws) ||
+               (no_ws && empty_rs);
+  if (! no_fds)
+  {
+    if (NULL != rs)
+    {
+      extract_handles (rs,
+                       &read_nhandles,
+                       &read_nhandles_len,
+                       &read_fhandles,
+                       &read_fhandles_len);
+    }
+    if (NULL != ws)
+    {
+      extract_handles (ws,
+                       &write_nhandles,
+                       &write_nhandles_len,
+                       &write_fhandles,
+                       &write_fhandles_len);
+    }
+  }
+  /**
+   * here we consider the case that a GNUNET_NETWORK_FDSet might be empty
+   * although its maximum FD number (nsds) is greater than 0. We handle
+   * this case gracefully because some libraries such as libmicrohttpd
+   * only provide a hint what the maximum FD number in an FD set might be
+   * and not the exact FD number (see e.g. gnunet-rest-service.c)
+   */
+  int no_fds_extracted = (0 == read_nhandles_len) &&
+                         (0 == read_fhandles_len) &&
+                         (0 == write_nhandles_len) &&
+                         (0 == write_fhandles_len);
+  if (no_fds || no_fds_extracted)
     return GNUNET_SCHEDULER_add_delayed_with_priority (delay,
                                                        prio,
                                                        task,
                                                        task_cls);
-  /* scheduler must be running */
-  GNUNET_assert (NULL != scheduler_driver);
-  GNUNET_assert (NULL != active_task);
-  GNUNET_assert (NULL != task);
-  read_nhandles = NULL;
-  write_nhandles = NULL;
-  read_fhandles = NULL;
-  write_fhandles = NULL;
-  read_nhandles_len = 0;
-  write_nhandles_len = 0;
-  read_fhandles_len = 0;
-  write_fhandles_len = 0;
-  if (NULL != rs)
-  {
-    extract_handles (rs,
-                     &read_nhandles,
-                     &read_nhandles_len,
-                     &read_fhandles,
-                     &read_fhandles_len);
-  }
-  if (NULL != ws)
-  {
-    extract_handles (ws,
-                     &write_nhandles,
-                     &write_nhandles_len,
-                     &write_fhandles,
-                     &write_fhandles_len);
-  }
-  GNUNET_assert ((read_nhandles > 0) ||
-                 (read_fhandles > 0) ||
-                 (write_nhandles > 0) ||
-                 (write_fhandles > 0));
   t = GNUNET_new (struct GNUNET_SCHEDULER_Task);
   init_fd_info (t,
                 read_nhandles,

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]