gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r19243 - gnunet/src/ats


From: gnunet
Subject: [GNUnet-SVN] r19243 - gnunet/src/ats
Date: Wed, 18 Jan 2012 15:42:15 +0100

Author: wachs
Date: 2012-01-18 15:42:15 +0100 (Wed, 18 Jan 2012)
New Revision: 19243

Modified:
   gnunet/src/ats/gnunet-service-ats_addresses.c
   gnunet/src/ats/gnunet-service-ats_addresses.h
   gnunet/src/ats/gnunet-service-ats_addresses_mlp.c
   gnunet/src/ats/gnunet-service-ats_addresses_mlp.h
   gnunet/src/ats/test_ats_mlp.c
Log:
- functionality for "for all peers" constraints


Modified: gnunet/src/ats/gnunet-service-ats_addresses.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.c       2012-01-18 14:39:14 UTC 
(rev 19242)
+++ gnunet/src/ats/gnunet-service-ats_addresses.c       2012-01-18 14:42:15 UTC 
(rev 19243)
@@ -154,7 +154,9 @@
   memcpy (&aa[1], plugin_addr, plugin_addr_len);
   aa->plugin = GNUNET_strdup (plugin_name);
   aa->session_id = session_id;
-
+  aa->mlp_information = NULL;
+  aa->next = NULL;
+  aa->prev = NULL;
   return aa;
 }
 

Modified: gnunet/src/ats/gnunet-service-ats_addresses.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses.h       2012-01-18 14:39:14 UTC 
(rev 19242)
+++ gnunet/src/ats/gnunet-service-ats_addresses.h       2012-01-18 14:42:15 UTC 
(rev 19243)
@@ -34,6 +34,10 @@
 
 struct ATS_Address
 {
+  struct ATS_Address *next;
+
+  struct ATS_Address *prev;
+
   struct GNUNET_PeerIdentity peer;
 
   size_t addr_len;

Modified: gnunet/src/ats/gnunet-service-ats_addresses_mlp.c
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses_mlp.c   2012-01-18 14:39:14 UTC 
(rev 19242)
+++ gnunet/src/ats/gnunet-service-ats_addresses_mlp.c   2012-01-18 14:42:15 UTC 
(rev 19243)
@@ -34,7 +34,7 @@
 #endif
 #include "float.h"
 
-#define DEBUG_ATS GNUNET_YES
+#define DEBUG_ATS GNUNET_NO
 
 /* A very big value */
 #define M DBL_MAX
@@ -325,12 +325,14 @@
   double *ar= GNUNET_malloc (pi * sizeof (double));
   mlp->ar = ar;
 
-  /* Adding constraint rows */
-  /* Feasibility constraints */
-
-  /* c 1) bandwidth capping */
-  /* c 3) minimum bandwidth */
-  /* c 4) minimum number of connections */
+  /* Adding constraint rows
+   * This constraints are kind of "for all addresses"
+   * Feasibility constraints:
+   *
+   * c 1) bandwidth capping
+   * c 3) minimum bandwidth
+   * c 4) minimum number of connections
+   */
   mlp->r_c4 = glp_add_rows (mlp->prob, 1);
   glp_set_row_bnds (mlp->prob, mlp->r_c4, GLP_LO, mlp->n_min, 0.0);
 
@@ -811,6 +813,37 @@
     address->mlp_information = mlpi;
     mlp->addr_in_problem ++;
 
+    /* Check for and add peer */
+    struct ATS_Peer *peer = mlp->peer_head;
+    while (peer != NULL)
+    {
+      if (0 == memcmp (&address->peer, &peer->id, sizeof (struct 
GNUNET_PeerIdentity)))
+        break;
+      peer = peer->next;
+    }
+    if (peer == NULL)
+    {
+#if DEBUG_ATS
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Adding new peer `%s'\n", 
GNUNET_i2s (&address->peer));
+#endif
+      peer = GNUNET_malloc (sizeof (struct ATS_Peer));
+      peer->head = NULL;
+      peer->tail = NULL;
+      memcpy (&peer->id, &address->peer, sizeof (struct GNUNET_PeerIdentity));
+      GNUNET_assert(address->prev == NULL);
+      GNUNET_assert(address->next == NULL);
+      GNUNET_CONTAINER_DLL_insert (peer->head, peer->tail, address);
+      GNUNET_CONTAINER_DLL_insert (mlp->peer_head, mlp->peer_tail, peer);
+    }
+    else
+    {
+#if DEBUG_ATS
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Adding address to peer `%s'\n", 
GNUNET_i2s (&address->peer));
+#endif
+      GNUNET_CONTAINER_DLL_insert (peer->head, peer->tail, address);
+    }
+
+
     /* Add bandwidth column */
     col = glp_add_cols (mlp->prob, 2);
     mlpi->c_b = col;
@@ -836,9 +869,13 @@
     glp_set_col_kind (mlp->prob, mlpi->c_n, GLP_IV);
     /* Objective function coefficient == 0 */
     glp_set_obj_coef (mlp->prob, mlpi->c_n, 0);
-
-    /* Add */
   }
+  else
+  {
+#if DEBUG_ATS
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Updating existing address to peer 
`%s'\n", GNUNET_i2s (&address->peer));
+#endif
+  }
 
   /* Recalculate */
   if (new == GNUNET_YES)
@@ -869,6 +906,30 @@
     mlp->addr_in_problem --;
   }
 
+  /* Remove from peer list */
+  struct ATS_Peer *head = mlp->peer_head;
+  while (head != NULL)
+  {
+    if (0 == memcmp (&address->peer, &head->id, sizeof (struct 
GNUNET_PeerIdentity)))
+      break;
+    head = head->next;
+  }
+  GNUNET_assert (head != NULL);
+#if DEBUG_ATS
+  GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Deleting address for `%s'\n", 
GNUNET_i2s (&address->peer));
+#endif
+  GNUNET_CONTAINER_DLL_remove (head->head, head->tail, address);
+
+  if ((head->head == NULL) && (head->tail == NULL))
+  {
+    /* No address for peer left, remove peer */
+#if DEBUG_ATS
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Deleting peer `%s'\n", GNUNET_i2s 
(&address->peer));
+#endif
+    GNUNET_CONTAINER_DLL_remove (mlp->peer_head, mlp->peer_tail, head);
+    GNUNET_free (head);
+  }
+
   /* Update problem */
 
   /* Recalculate */

Modified: gnunet/src/ats/gnunet-service-ats_addresses_mlp.h
===================================================================
--- gnunet/src/ats/gnunet-service-ats_addresses_mlp.h   2012-01-18 14:39:14 UTC 
(rev 19242)
+++ gnunet/src/ats/gnunet-service-ats_addresses_mlp.h   2012-01-18 14:42:15 UTC 
(rev 19243)
@@ -40,6 +40,17 @@
 #define MLP_MAX_EXEC_DURATION   
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 3)
 #define MLP_MAX_ITERATIONS      INT_MAX
 
+struct ATS_Peer
+{
+  struct ATS_Peer *next;
+  struct ATS_Peer *prev;
+
+  struct GNUNET_PeerIdentity id;
+
+  struct ATS_Address *head;
+  struct ATS_Address *tail;
+};
+
 /**
  * MLP Handle
  */
@@ -135,6 +146,9 @@
 
   /* Information about the problem */
 
+  struct ATS_Peer *peer_head;
+  struct ATS_Peer *peer_tail;
+
   /* current problem matrix */
   /* row index array */
   int *ia;

Modified: gnunet/src/ats/test_ats_mlp.c
===================================================================
--- gnunet/src/ats/test_ats_mlp.c       2012-01-18 14:39:14 UTC (rev 19242)
+++ gnunet/src/ats/test_ats_mlp.c       2012-01-18 14:42:15 UTC (rev 19243)
@@ -60,15 +60,27 @@
   addresses = GNUNET_CONTAINER_multihashmap_create (10);
 
   GNUNET_CRYPTO_hash_create_random(GNUNET_CRYPTO_QUALITY_WEAK, 
&addr.peer.hashPubKey);
+  addr.mlp_information = NULL;
+  addr.next = NULL;
+  addr.prev = NULL;
   addr.plugin = strdup ("dummy");
   GNUNET_CONTAINER_multihashmap_put(addresses, &addr.peer.hashPubKey, &addr, 
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
 
   mlp = GAS_mlp_init (cfg, NULL, MLP_MAX_EXEC_DURATION, MLP_MAX_ITERATIONS);
 
-  GAS_mlp_address_update(mlp, addresses, &addr);
+  /* Add a new address */
+  GAS_mlp_address_update (mlp, addresses, &addr);
 
   GNUNET_assert (mlp != NULL);
+  GNUNET_assert (mlp->addr_in_problem == 1);
 
+  /* Update an new address */
+  GAS_mlp_address_update (mlp, addresses, &addr);
+  GNUNET_assert (mlp->addr_in_problem == 1);
+
+  /* Delete an address */
+  GAS_mlp_address_delete (mlp, addresses, &addr);
+
   GAS_mlp_done (mlp);
 
   GNUNET_free (addr.plugin);




reply via email to

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