gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r5194 - GNUnet/src/transports


From: gnunet
Subject: [GNUnet-SVN] r5194 - GNUnet/src/transports
Date: Sun, 1 Jul 2007 03:06:10 -0600 (MDT)

Author: grothoff
Date: 2007-07-01 03:06:10 -0600 (Sun, 01 Jul 2007)
New Revision: 5194

Modified:
   GNUnet/src/transports/tcp.c
   GNUnet/src/transports/tcp6.c
   GNUnet/src/transports/tcp_helper.c
Log:
re-use connections

Modified: GNUnet/src/transports/tcp.c
===================================================================
--- GNUnet/src/transports/tcp.c 2007-07-01 07:47:02 UTC (rev 5193)
+++ GNUnet/src/transports/tcp.c 2007-07-01 09:06:10 UTC (rev 5194)
@@ -301,9 +301,28 @@
   struct sockaddr_in soaddr;
   struct SocketHandle * s;
   int i;
+  TCPSession * session;
 
   if (selector == NULL)
     return SYSERR;
+  MUTEX_LOCK(tcplock);
+  session = sessions;
+  while (session != NULL) {
+    if (0 == memcmp(&session->sender,
+                   &hello->senderIdentity,
+                   sizeof(PeerIdentity))) {
+      MUTEX_LOCK(session->lock);
+      if (session->in_select) {
+       session->users++;
+       MUTEX_UNLOCK(session->lock);
+       MUTEX_LOCK(tcplock);
+       *tsessionPtr = session->tsession;
+       return OK;
+      }
+      MUTEX_UNLOCK(session->lock);
+    }    
+  }  
+  MUTEX_UNLOCK(tcplock);
   haddr = (HostAddress*) &hello[1];
 #if DEBUG_TCP
   GE_LOG(ectx,

Modified: GNUnet/src/transports/tcp6.c
===================================================================
--- GNUnet/src/transports/tcp6.c        2007-07-01 07:47:02 UTC (rev 5193)
+++ GNUnet/src/transports/tcp6.c        2007-07-01 09:06:10 UTC (rev 5194)
@@ -251,9 +251,28 @@
   struct addrinfo hints, *res, *res0;
   int rtn;
   struct SocketHandle * s;
+  TCPSession * session;
 
   if (selector == NULL)
     return SYSERR;
+  MUTEX_LOCK(tcplock);
+  session = sessions;
+  while (session != NULL) {
+    if (0 == memcmp(&session->sender,
+                   &hello->senderIdentity,
+                   sizeof(PeerIdentity))) {
+      MUTEX_LOCK(session->lock);
+      if (session->in_select) {
+       session->users++;
+       MUTEX_UNLOCK(session->lock);
+       MUTEX_LOCK(tcplock);
+       *tsessionPtr = session->tsession;
+       return OK;
+      }
+      MUTEX_UNLOCK(session->lock);
+    }    
+  }  
+  MUTEX_UNLOCK(tcplock);
   haddr = (Host6Address*) &hello[1];
   memset(&hints, 0, sizeof(hints));
   hints.ai_family = PF_INET6;

Modified: GNUnet/src/transports/tcp_helper.c
===================================================================
--- GNUnet/src/transports/tcp_helper.c  2007-07-01 07:47:02 UTC (rev 5193)
+++ GNUnet/src/transports/tcp_helper.c  2007-07-01 09:06:10 UTC (rev 5194)
@@ -43,13 +43,21 @@
 /**
  * Transport Session handle.
  */
-typedef struct {
+typedef struct TCPSession {
+
+  struct TCPSession * next;
+
   /**
    * the tcp socket (used to identify this connection with selector)
    */
   struct SocketHandle * sock;
 
   /**
+   * Our tsession.
+   */
+  TSession * tsession;
+
+  /**
    * mutex for synchronized access to 'users'
    */
   struct MUTEX * lock;
@@ -102,16 +110,49 @@
 
 static struct MUTEX * tcplock;
 
+static struct TCPSession * sessions;
+
+
+/**
+ * You must hold the tcplock when calling this
+ * function (and should not hold the tcpsession's lock
+ * any more).
+ */
+static void freeTCPSession(TCPSession * tcpsession) {
+  TCPSession * pos;
+  TCPSession * prev;
+  
+  MUTEX_DESTROY(tcpsession->lock);
+  FREENONNULL(tcpsession->accept_addr);
+  pos = sessions;
+  prev = NULL;
+  while (pos != NULL) {
+    if (pos == tcpsession) {
+      if (prev == NULL)
+       sessions = pos->next;
+      else
+       prev->next = pos->next;
+      break;
+    }
+    prev = pos;
+    pos = pos->next;
+  }
+  FREE(tcpsession->tsession);
+  FREE(tcpsession);
+}
+
 static int tcpDisconnect(TSession * tsession) {
   TCPSession * tcpsession = tsession->internal;
 
   GE_ASSERT(ectx, selector != NULL);
+  MUTEX_LOCK(tcplock);
   MUTEX_LOCK(tcpsession->lock);
   GE_ASSERT(ectx, tcpsession->users > 0);
   tcpsession->users--;
   if ( (tcpsession->users > 0) ||
        (tcpsession->in_select == YES) ) {
     MUTEX_UNLOCK(tcpsession->lock);
+    MUTEX_UNLOCK(tcplock);
     return OK;
   }
 #if DEBUG_TCP
@@ -123,12 +164,11 @@
                    tcpsession->sock);
   if (tcpsession->in_select == NO) {
     MUTEX_UNLOCK(tcpsession->lock);
-    MUTEX_DESTROY(tcpsession->lock);
-    FREENONNULL(tcpsession->accept_addr);
-    FREE(tcpsession);
-    FREE(tsession);
+    freeTCPSession(tcpsession);
+    MUTEX_UNLOCK(tcplock);
   } else {
     MUTEX_UNLOCK(tcpsession->lock);
+    MUTEX_UNLOCK(tcplock);
   }
   return OK;
 }
@@ -270,6 +310,7 @@
   tsession = MALLOC(sizeof(TSession));
   tsession->ttype = TCP_PROTOCOL_NUMBER;
   tsession->internal = tcpSession;
+  tcpSession->tsession = tsession;
   tsession->peer = *(coreAPI->myIdentity);
   if (addr_len > sizeof(IPaddr)) {
     tcpSession->accept_addr = MALLOC(addr_len);
@@ -282,6 +323,10 @@
     tcpSession->addr_len = 0;
     tcpSession->accept_addr = NULL; 
   }
+  MUTEX_LOCK(tcplock);
+  tcpSession->next = sessions;
+  sessions = tcpSession;
+  MUTEX_UNLOCK(tcplock);
   return tsession;
 }                                      
 
@@ -292,17 +337,16 @@
   TSession * tsession = sock_ctx;
   TCPSession * tcpSession = tsession->internal;
 
+  MUTEX_LOCK(tcplock);
   MUTEX_LOCK(tcpSession->lock);
   tcpSession->in_select = NO;
   if (tcpSession->users == 0) {
     MUTEX_UNLOCK(tcpSession->lock);
-    MUTEX_DESTROY(tcpSession->lock);
-    FREENONNULL(tcpSession->accept_addr);
-    FREE(tcpSession);
-    FREE(tsession);
+    freeTCPSession(tcpSession);
   } else {
     MUTEX_UNLOCK(tcpSession->lock);
   }
+  MUTEX_UNLOCK(tcplock);
 }
 
 /**
@@ -439,6 +483,7 @@
   tsession->internal = tcpSession;
   tsession->ttype = protocolNumber;
   tsession->peer = hello->senderIdentity;
+  tcpSession->tsession = tsession;
   tcpSession->lock = MUTEX_CREATE(YES);
   tcpSession->users = 1; /* caller */
   tcpSession->in_select = NO;
@@ -476,6 +521,8 @@
   } else if (stats != NULL)
     stats->change(stat_bytesSent,
                  sizeof(TCPWelcome));
+  tcpSession->next = sessions;
+  sessions = tcpSession;
   MUTEX_UNLOCK(tcplock);
   *tsessionPtr = tsession;
   return OK;





reply via email to

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