gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r7985 - GNUnet/src/applications/dv/module


From: gnunet
Subject: [GNUnet-SVN] r7985 - GNUnet/src/applications/dv/module
Date: Wed, 3 Dec 2008 14:34:03 -0700 (MST)

Author: nevans
Date: 2008-12-03 14:34:02 -0700 (Wed, 03 Dec 2008)
New Revision: 7985

Modified:
   GNUnet/src/applications/dv/module/dv.c
Log:
backup before change

Modified: GNUnet/src/applications/dv/module/dv.c
===================================================================
--- GNUnet/src/applications/dv/module/dv.c      2008-12-03 19:58:39 UTC (rev 
7984)
+++ GNUnet/src/applications/dv/module/dv.c      2008-12-03 21:34:02 UTC (rev 
7985)
@@ -41,6 +41,7 @@
 
 unsigned long long fisheye_depth;
 unsigned long long max_table_size;
+unsigned int send_interval;
 unsigned short curr_table_size;
 unsigned short closing = 0;
 
@@ -50,6 +51,7 @@
    * Generic list structure for neighbor lists
    */
   struct GNUNET_dv_neighbor *next;
+  struct GNUNET_dv_neighbor *prev;
 
   /**
    * Identity of neighbor
@@ -102,46 +104,55 @@
   return ret;
 }
 
+/*
+ * Handles the receipt of a peer disconnect notification.
+ *
+ */
 static void
 peer_disconnect_handler (const GNUNET_PeerIdentity * peer, void *unused)
 {
   struct GNUNET_dv_neighbor *pos = neighbors;
-  struct GNUNET_dv_neighbor *prev = NULL;
-  int not_found = 1;
+  struct GNUNET_dv_neighbor *temp = NULL;
+
   GNUNET_mutex_lock (dvMutex);
-  while ((pos->next != NULL) && (not_found))
-    {
-      prev = pos;
-      if (memcmp (&peer, &pos->next->neighbor, sizeof (GNUNET_PeerIdentity))
-          == 0)
-        not_found = 0;
-      pos = pos->next;
-    }
-  if ((prev == NULL)
-      && (memcmp (&peer, &pos->next->neighbor, sizeof (GNUNET_PeerIdentity))
-          == 0))
-    {
-      if (neighbors->referrer != NULL)
-        GNUNET_free (neighbors->referrer);
-      GNUNET_free (neighbors);
-      neighbors = NULL;
-      curr_table_size = 0;
-    }
-  else if (prev != NULL)
-    {
-      prev->next = pos->next;
-      GNUNET_free (pos->neighbor);
-      if (pos->referrer != NULL)
-        GNUNET_free (pos->referrer);
-      GNUNET_free (pos);
-    }
-  GNUNET_mutex_unlock (dvMutex);
+
+  while (pos != NULL)
+  {
+       if ((memcmp (&peer, &pos->neighbor, sizeof (GNUNET_PeerIdentity))
+                 == 0) || (memcmp (&peer, &pos->referrer, sizeof 
(GNUNET_PeerIdentity))
+                 == 0))
+         {
+               if (pos->prev != NULL)
+               {
+                       pos->prev->next = pos->next;
+               }
+               else
+               {
+                       neighbors = pos->next;
+               }
+
+               if (pos->next != NULL)
+               {
+                       pos->next->prev = pos->prev;
+               }
+
+               temp = pos->next;
+               GNUNET_free(pos->neighbor);
+               if (pos->referrer != NULL)
+                       GNUNET_free(pos->referrer);
+               GNUNET_free(pos);
+               pos = temp;
+         }
+         else
+               pos = pos->next;
+  }
+
+       GNUNET_mutex_unlock (dvMutex);
   return;
 }
 
 struct GNUNET_dv_neighbor *
-findNeighbor (const GNUNET_PeerIdentity * neighbor,
-              const GNUNET_PeerIdentity * referrer)
+findNeighbor (const GNUNET_PeerIdentity * neighbor)
 {
   struct GNUNET_dv_neighbor *pos = neighbors;
 
@@ -150,14 +161,7 @@
       if (memcmp (&neighbor, &pos->neighbor, sizeof (GNUNET_PeerIdentity)) ==
           0)
         {
-          if ((referrer == NULL) && (&pos->referrer == NULL))
-            return pos;
-          else if ((referrer != NULL) && (&pos->referrer != NULL)
-                   &&
-                   (memcmp
-                    (&referrer, &pos->referrer,
-                     sizeof (GNUNET_PeerIdentity)) == 0))
-            return pos;
+          return pos;
         }
       pos = pos->next;
     }
@@ -171,7 +175,7 @@
   int ret = GNUNET_OK;
 
   GNUNET_mutex_lock (dvMutex);
-  struct GNUNET_dv_neighbor *dv_neighbor = findNeighbor (neighbor, referrer);
+  struct GNUNET_dv_neighbor *dv_neighbor = findNeighbor (neighbor);
 
   if (dv_neighbor != NULL)
     {
@@ -179,6 +183,18 @@
         {
           dv_neighbor->cost = cost;
         }
+      if ((referrer != NULL) && (dv_neighbor->referrer != NULL) && 
(memcmp(dv_neighbor->referrer,referrer,sizeof(GNUNET_PeerIdentity)) != 0))
+      {
+       GNUNET_free(dv_neighbor->referrer);
+       dv_neighbor->referrer = GNUNET_malloc(sizeof(GNUNET_PeerIdentity));
+       memcpy(&dv_neighbor->referrer,&referrer,sizeof(GNUNET_PeerIdentity));
+      }
+      else if ((referrer != NULL)&&(dv_neighbor->referrer == NULL))
+      {
+       dv_neighbor->referrer = GNUNET_malloc(sizeof(GNUNET_PeerIdentity));
+       memcpy(&dv_neighbor->referrer,&referrer,sizeof(GNUNET_PeerIdentity));
+      }
+
     }
   else
     {
@@ -199,6 +215,8 @@
           dv_neighbor->referrer = NULL;
         }
 
+                       dv_neighbor->prev = NULL;
+                       neighbors->prev = dv_neighbor;
       dv_neighbor->next = neighbors;
       neighbors = dv_neighbor;
       curr_table_size++;
@@ -216,9 +234,9 @@
 }
 
 static void *
-connection_poll_dv_calc_thread (void *rcls)
+connection_poll_thread (void *rcls)
 {
-  static GNUNET_CoreAPIForPlugins *capi = rcls;
+  GNUNET_CoreAPIForPlugins *capi = rcls;
 
   while (!closing)
     {
@@ -226,8 +244,61 @@
       GNUNET_thread_sleep (30 * GNUNET_CRON_SECONDS);
     }
 
+       return NULL;
 }
 
+static void *
+neighbor_send_thread (void *rcls)
+{
+
+       struct GNUNET_dv_neighbor *about = NULL;
+       struct GNUNET_dv_neighbor *to = NULL;
+       p2p_dv_MESSAGE_NeighborInfo *message = 
GNUNET_malloc(sizeof(p2p_dv_MESSAGE_NeighborInfo));
+
+       message->header.size = htons (sizeof(p2p_dv_MESSAGE_NeighborInfo));
+       message->header.type = htons (GNUNET_P2P_PROTO_DV_NEIGHBOR_MESSAGE);
+       message->reserved = htonl(0);
+
+  while (!closing)
+       {
+               //updateSendInterval();
+               about = chooseAboutNeighbor();
+               to = chooseToNeighbor();
+
+               if (message->neighbor != NULL)
+               {
+                       GNUNET_free(message->neighbor);
+               }
+               message->neighbor = GNUNET_malloc(sizeof(GNUNET_PeerIdentity));
+               message->cost = htonl(about->cost);
+               
memcpy(&message->neighbor,&about->neighbor,sizeof(GNUNET_PeerIdentity));
+               coreAPI->ciphertext_send(to->neighbor,&message,0,send_interval 
* GNUNET_CRON_MILLISECONDS);
+
+               GNUNET_thread_sleep (send_interval * GNUNET_CRON_MILLISECONDS);
+       }
+
+  if (message->neighbor != NULL)
+       {
+               GNUNET_free(message->neighbor);
+       }
+
+  GNUNET_free(message);
+
+       return NULL;
+}
+
+struct GNUNET_dv_neighbor *
+chooseToNeighbor()
+{
+
+}
+
+struct GNUNET_dv_neighbor *
+chooseAboutNeighbor()
+{
+
+}
+
 int
 initialize_module_dv (GNUNET_CoreAPIForPlugins * capi)
 {





reply via email to

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