[Top][All Lists]
[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;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r5194 - GNUnet/src/transports,
gnunet <=