[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r5308 - in GNUnet/src: server util/network
From: |
gnunet |
Subject: |
[GNUnet-SVN] r5308 - in GNUnet/src: server util/network |
Date: |
Sun, 15 Jul 2007 10:08:29 -0600 (MDT) |
Author: grothoff
Date: 2007-07-15 10:08:22 -0600 (Sun, 15 Jul 2007)
New Revision: 5308
Modified:
GNUnet/src/server/tcpserver.c
GNUnet/src/util/network/select.c
Log:
Fixing problem with very large malloc for slow clients.
See report on gnunet-help:
http://lists.gnu.org/archive/html/help-gnunet/2007-07/msg00014.html
Modified: GNUnet/src/server/tcpserver.c
===================================================================
--- GNUnet/src/server/tcpserver.c 2007-07-13 14:15:33 UTC (rev 5307)
+++ GNUnet/src/server/tcpserver.c 2007-07-15 16:08:22 UTC (rev 5308)
@@ -199,7 +199,7 @@
GE_DEBUG | GE_DEVELOPER | GE_REQUEST,
"%s: sending reply to client\n", __FUNCTION__);
#endif
- return select_write (selector, handle->sock, message, NO, YES);
+ return select_write (selector, handle->sock, message, YES, YES);
}
void
Modified: GNUnet/src/util/network/select.c
===================================================================
--- GNUnet/src/util/network/select.c 2007-07-13 14:15:33 UTC (rev 5307)
+++ GNUnet/src/util/network/select.c 2007-07-15 16:08:22 UTC (rev 5308)
@@ -30,6 +30,13 @@
#define DEBUG_SELECT NO
+struct SemaphoreList
+{
+ struct SemaphoreList * next;
+
+ struct SEMAPHORE * sem;
+};
+
/**
* Select Session handle.
*/
@@ -42,6 +49,12 @@
struct SocketHandle *sock;
/**
+ * List of semaphores to raise whenever the
+ * write buffer is empty.
+ */
+ struct SemaphoreList * list;
+
+ /**
* Client connection context.
*/
void *sock_ctx;
@@ -391,6 +404,7 @@
/* free compaction! */
session->wspos = 0;
session->wapos = 0;
+
if (session->wsize > sh->memory_quota)
{
/* if we went over quota before because of
@@ -929,9 +943,11 @@
Session *session;
int i;
unsigned short len;
- int fresh_write;
char *newBuffer;
unsigned int newBufferSize;
+ struct SemaphoreList list;
+ struct SemaphoreList * prev;
+ struct SemaphoreList * pos;
#if DEBUG_SELECT
GE_LOG (sh->ectx,
@@ -962,7 +978,6 @@
MUTEX_UNLOCK (sh->lock);
return NO;
}
- fresh_write = (session->wapos == session->wspos);
if (session->wsize - session->wapos < len)
{
/* need to make space in some way or other */
@@ -1002,9 +1017,29 @@
GE_ASSERT (NULL, session->wapos + len <= session->wsize);
memcpy (&session->wbuff[session->wapos], msg, len);
session->wapos += len;
+ if (mayBlock) {
+ list.next = session->list;
+ list.sem = SEMAPHORE_CREATE(0);
+ session->list = &list;
+ }
MUTEX_UNLOCK (sh->lock);
- if (fresh_write)
- signalSelect (sh);
+ signalSelect (sh);
+ if (mayBlock) {
+ SEMAPHORE_DOWN(list.sem, YES);
+ prev = NULL;
+ MUTEX_LOCK (sh->lock);
+ pos = session->list;
+ while (pos != &list) {
+ GE_ASSERT(NULL, pos != NULL);
+ prev = pos;
+ pos = pos->next;
+ }
+ if (prev == NULL)
+ session->list = list.next;
+ else
+ prev->next = list.next;
+ MUTEX_UNLOCK (sh->lock);
+ }
return OK;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r5308 - in GNUnet/src: server util/network,
gnunet <=