gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r29231 - gnunet/src/testbed


From: gnunet
Subject: [GNUnet-SVN] r29231 - gnunet/src/testbed
Date: Thu, 12 Sep 2013 15:32:04 +0200

Author: harsha
Date: 2013-09-12 15:32:04 +0200 (Thu, 12 Sep 2013)
New Revision: 29231

Modified:
   gnunet/src/testbed/testbed_api_topology.c
Log:
- fix likely possible nonterminating loop for small `cap'


Modified: gnunet/src/testbed/testbed_api_topology.c
===================================================================
--- gnunet/src/testbed/testbed_api_topology.c   2013-09-12 12:37:45 UTC (rev 
29230)
+++ gnunet/src/testbed/testbed_api_topology.c   2013-09-12 13:32:04 UTC (rev 
29231)
@@ -596,17 +596,20 @@
 static void
 gen_scale_free (struct TopologyContext *tc, uint16_t cap, uint8_t m)
 {
+  unsigned int *deg;
+  unsigned int *etab;
+  unsigned int *used;
+  unsigned int etaboff;
   unsigned int cnt;
   unsigned int cnt2;
   unsigned int peer;
   unsigned int random_peer;
-  unsigned int *deg;
-  unsigned int *etab;
-  unsigned int *used;
   unsigned int links;
-  unsigned int random;
+  unsigned int off;
+  unsigned int redo_threshold;
 
   links = 0;
+  etaboff = 0;  
   tc->link_array_size = tc->num_peers * m;
   tc->link_array = GNUNET_malloc_large (sizeof (struct OverlayLink) *
                                         tc->link_array_size);
@@ -617,8 +620,8 @@
   make_link (&tc->link_array[0], 0, 1, tc);
   deg[0]++;
   deg[1]++;
-  etab[2 * links] = 0;
-  etab[(2 * links) + 1] = 1;
+  etab[etaboff++] = 0;
+  etab[etaboff++] = 1;
   links = 1;
   for (peer = 2; peer < tc->num_peers; peer++)
   {
@@ -626,23 +629,41 @@
       continue;
     for (cnt = 0; cnt < GNUNET_MIN (peer, m); cnt++)
     {
+      redo_threshold = 0;
     redo:
-      random = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, (2 * 
links));
-      random_peer = etab[random];
+      off = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, etaboff);
+      random_peer = etab[off];
       if (cap < deg[random_peer])
+      {
+        if (++redo_threshold > GNUNET_MAX (1, cap / 2))
+        {
+          redo_threshold = 0;
+          off = 0;
+          for (cnt2 = 0; cnt2 < etaboff; cnt2++)
+          {
+            if (random_peer == etab[cnt2])
+            {
+              off++;
+              continue;
+            }
+            etab[cnt2 - off] = etab[cnt2];
+          }
+          etaboff -= off;
+        }
         goto redo;
+      }
       for (cnt2 = 0; cnt2 < cnt; cnt2++)
         if (random_peer == used[cnt2])
           goto redo;
-      make_link (&tc->link_array[links + cnt], etab[random], peer, tc);
+      make_link (&tc->link_array[links + cnt], random_peer, peer, tc);
       deg[random_peer]++;
       deg[peer]++;      
       used[cnt] = random_peer;
     }
     for (cnt = 0; cnt < GNUNET_MIN (peer, m); cnt++)
     {
-      etab[(2 * links) + cnt] = used[cnt];
-      etab[(2 * links) + cnt + 1] = peer;
+      etab[etaboff++] = used[cnt];
+      etab[etaboff++] = peer;
     }
     links += GNUNET_MIN (peer, m);
   }




reply via email to

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