gnunet-svn
[Top][All Lists]
Advanced

[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;
 }
 





reply via email to

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