gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [gnunet] branch master updated (c05709997 -> 602249cc0)


From: gnunet
Subject: [GNUnet-SVN] [gnunet] branch master updated (c05709997 -> 602249cc0)
Date: Wed, 25 Jan 2017 20:04:34 +0100

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

grothoff pushed a change to branch master
in repository gnunet.

    from c05709997 towards proper DATA_ACK handling
     new c7dc4199e fix confusing indentation
     new 64d8b6236 typo in comment
     new a6a84661d fix insert_sorted macro
     new 602249cc0 handle ACKs past client down

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 src/cadet/gnunet-service-cadet-new_channel.c |  19 ++++-
 src/include/gnunet_container_lib.h           |  28 ++++---
 src/util/.gitignore                          |   1 +
 src/util/test_container_dll.c                | 115 +++++++++++++++++++++++++++
 4 files changed, 150 insertions(+), 13 deletions(-)
 create mode 100644 src/util/test_container_dll.c

diff --git a/src/cadet/gnunet-service-cadet-new_channel.c 
b/src/cadet/gnunet-service-cadet-new_channel.c
index 8812af4ec..83911f530 100644
--- a/src/cadet/gnunet-service-cadet-new_channel.c
+++ b/src/cadet/gnunet-service-cadet-new_channel.c
@@ -861,9 +861,16 @@ send_ack_to_client (struct CadetChannel *ch,
   struct GNUNET_CADET_LocalAck *ack;
   struct CadetChannelClient *ccc;
 
+  ccc = (GNUNET_YES == to_owner) ? ch->owner : ch->dest;
+  if (NULL == ccc)
+  {
+    /* This can happen if we are just getting ACKs after
+       our local client already disconnected. */
+    GNUNET_assert (GNUNET_YES == ch->destroy);
+    return;
+  }
   env = GNUNET_MQ_msg (ack,
                        GNUNET_MESSAGE_TYPE_CADET_LOCAL_ACK);
-  ccc = (GNUNET_YES == to_owner) ? ch->owner : ch->dest;
   ack->ccn = ccc->ccn;
   LOG (GNUNET_ERROR_TYPE_DEBUG,
        "Sending CADET_LOCAL_ACK to %s (%s) at ccn %X (%u/%u pending)\n",
@@ -1285,6 +1292,11 @@ handle_matching_ack (struct CadetChannel *ch,
        GCCH_2s (ch),
        (unsigned int) ntohl (crm->data_message->mid.mid),
        ch->pending_messages);
+  if (NULL != crm->qe)
+  {
+    GCT_send_cancel (crm->qe);
+    crm->qe = NULL;
+  }
   GNUNET_free (crm->data_message);
   GNUNET_free (crm);
   send_ack_to_client (ch,
@@ -1331,14 +1343,18 @@ GCCH_handle_channel_plaintext_data_ack (struct 
CadetChannel *ch,
     {
       handle_matching_ack (ch,
                            crm);
+      found = GNUNET_YES;
       continue;
     }
     delta = (unsigned int) (ntohl (crm->data_message->mid.mid) - mid_base) - 1;
     if (delta >= 64)
       continue;
     if (0 != (mid_mask & (1LLU << delta)))
+    {
       handle_matching_ack (ch,
                            crm);
+      found = GNUNET_YES;
+    }
   }
   if (GNUNET_NO == found)
   {
@@ -1423,6 +1439,7 @@ cmp_crm_by_next_retry (void *cls,
   return GNUNET_NO;
 }
 
+
 /**
  * Function called once the tunnel has sent one of our messages.
  * If the message is unreliable, simply frees the `crm`. If the
diff --git a/src/include/gnunet_container_lib.h 
b/src/include/gnunet_container_lib.h
index d2f8c5d9c..c77d82fd3 100644
--- a/src/include/gnunet_container_lib.h
+++ b/src/include/gnunet_container_lib.h
@@ -2092,8 +2092,8 @@ GNUNET_CONTAINER_multihashmap32_iterator_destroy (struct 
GNUNET_CONTAINER_MultiH
                         element, \
                         head)) ) \
   { \
-    /* insert at head, e;e,emt < head */ \
-    GNUNET_CONTAINER_DLL_insert (head, \
+    /* insert at head, element < head */ \
+    GNUNET_CONTAINER_DLL_insert (head,                                \
                                  tail, \
                                  element); \
   } \
@@ -2109,17 +2109,21 @@ GNUNET_CONTAINER_multihashmap32_iterator_destroy 
(struct GNUNET_CONTAINER_MultiH
                       element, \
                       pos)) \
         break; /* element < pos */ \
-      if (NULL == pos) /* => element > tail */ \
-        GNUNET_CONTAINER_DLL_insert_tail (head, \
-                                          tail, \
-                                          element); \
-      else /* prev < element < pos */ \
-        GNUNET_CONTAINER_DLL_insert_after (head, \
-                                           tail, \
-                                           element, \
-                                           pos->prev); \
+    if (NULL == pos) /* => element > tail */ \
+    { \
+      GNUNET_CONTAINER_DLL_insert_tail (head,                             \
+                                        tail, \
+                                        element); \
+    } \
+    else /* prev < element < pos */ \
+    { \
+      GNUNET_CONTAINER_DLL_insert_after (head, \
+                                         tail, \
+                                         pos->prev, \
+                                         element); \
     } \
-  } while (0)
+  } \
+} while (0)
 
 
 /* ******************** Heap *************** */
diff --git a/src/util/.gitignore b/src/util/.gitignore
index f207e07bf..a0cb43874 100644
--- a/src/util/.gitignore
+++ b/src/util/.gitignore
@@ -22,6 +22,7 @@ test_connection_timeout.nc
 test_connection_timeout_no_connect.nc
 test_connection_transmit_cancel.nc
 test_container_bloomfilter
+test_container_dll
 test_container_heap
 test_container_meta_data
 test_container_multihashmap
diff --git a/src/util/test_container_dll.c b/src/util/test_container_dll.c
new file mode 100644
index 000000000..8ad08423a
--- /dev/null
+++ b/src/util/test_container_dll.c
@@ -0,0 +1,115 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2017 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING.  If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * @author Christian Grothoff
+ * @file util/test_container_dll.c
+ * @brief Test of DLL operations
+ */
+
+#include "platform.h"
+#include "gnunet_util_lib.h"
+
+/**
+ * Element in the DLL.
+ */
+struct Element
+{
+  /**
+   * Required pointer to previous element.
+   */
+  struct Element *prev;
+
+  /**
+   * Required pointer to next element.
+   */
+  struct Element *next;
+
+  /**
+   * Used to sort.
+   */
+  unsigned int value;
+};
+
+
+/**
+ * Compare two elements.
+ *
+ * @param cls closure, NULL
+ * @param e1 an element of to sort
+ * @param e2 another element to sort
+ * @return #GNUNET_YES if @e1 < @e2, otherwise #GNUNET_NO
+ */
+static int
+cmp_elem (void *cls,
+          struct Element *e1,
+          struct Element *e2)
+{
+  if (e1->value == e2->value)
+    return 0;
+  return (e1->value < e2->value) ? 1 : -1;
+}
+
+
+int
+main (int argc, char **argv)
+{
+  unsigned int values2[] = {
+    4, 5, 8, 6, 9, 3, 7, 2, 6, 1, 0
+  };
+  unsigned int values[] = {
+    1, 3, 2, 0
+  };
+  struct Element *head = NULL;
+  struct Element *tail = NULL;
+  struct Element *e;
+  unsigned int want;
+
+  GNUNET_log_setup ("test-container-dll",
+                    "WARNING",
+                    NULL);
+  for (unsigned int off=0;
+       0 != values[off];
+       off++)
+  {
+    e = GNUNET_new (struct Element);
+    e->value = values[off];
+    GNUNET_CONTAINER_DLL_insert_sorted (struct Element,
+                                        cmp_elem,
+                                        NULL,
+                                        head,
+                                        tail,
+                                        e);
+  }
+
+  want = 1;
+  while (NULL != (e = head))
+  {
+    GNUNET_assert (e->value == want);
+    GNUNET_CONTAINER_DLL_remove (head,
+                                 tail,
+                                 e);
+    GNUNET_free (e);
+    want++;
+  }
+  return 0;
+}
+
+/* end of test_container_heap.c */

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



reply via email to

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