gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r23152 - Extractor/src/main


From: gnunet
Subject: [GNUnet-SVN] r23152 - Extractor/src/main
Date: Tue, 7 Aug 2012 18:30:49 +0200

Author: LRN
Date: 2012-08-07 18:30:49 +0200 (Tue, 07 Aug 2012)
New Revision: 23152

Modified:
   Extractor/src/main/extractor_ipc_w32.c
Log:
Grow channel buffer dynamically

Modified: Extractor/src/main/extractor_ipc_w32.c
===================================================================
--- Extractor/src/main/extractor_ipc_w32.c      2012-08-07 16:30:45 UTC (rev 
23151)
+++ Extractor/src/main/extractor_ipc_w32.c      2012-08-07 16:30:49 UTC (rev 
23152)
@@ -129,11 +129,14 @@
 
   /**
    * Buffer for reading data from the plugin.
-   * FIXME: we might want to grow this
-   * buffer dynamically instead of always using 32 MB!
    */
-  char data[MAX_META_DATA];
+  char *mdata;
 
+  /**
+   * Size of the 'mdata' buffer.
+   */
+  size_t mdata_size;
+
   /**
    * Number of valid bytes in the channel's buffer.
    */
@@ -443,7 +446,13 @@
       LOG_STRERROR ("malloc");
       return NULL;
     }
-  channel->shm = shm;
+  channel->mdata_size = 1024;
+  if (NULL == (channel->mdata = malloc (channel->mdata_size)))
+    {
+      LOG_STRERROR ("malloc");
+      free (channel);
+      return NULL;
+    }    channel->shm = shm;
   channel->plugin = plugin;
   channel->size = 0;
 
@@ -584,6 +593,7 @@
     free (channel->ov_write_buffer);
     channel->ov_write_buffer = NULL;
   }
+  free (channel->mdata);
   free (channel);
 }
 
@@ -674,6 +684,7 @@
   BOOL bresult;
   unsigned int i;
   unsigned int c;
+  char *ndata;
   HANDLE events[MAXIMUM_WAIT_OBJECTS];
 
   c = 0;
@@ -723,12 +734,33 @@
     if (dwresult == WAIT_OBJECT_0)
     {
       int ret;
+      if (channels[i]->mdata_size == channels[i]->size)
+       {
+         /* not enough space, need to grow allocation (if allowed) */
+         if (MAX_META_DATA == channels[i]->mdata_size)
+           {
+             LOG ("Inbound message from channel too large, aborting\n");
+             EXTRACTOR_IPC_channel_destroy_ (channels[i]);
+             channels[i] = NULL;
+           }
+         channels[i]->mdata_size *= 2;
+         if (channels[i]->mdata_size > MAX_META_DATA)
+           channels[i]->mdata_size = MAX_META_DATA;
+         if (NULL == (ndata = realloc (channels[i]->mdata,
+                                       channels[i]->mdata_size)))
+           {
+             LOG_STRERROR ("realloc");
+             EXTRACTOR_IPC_channel_destroy_ (channels[i]);
+             channels[i] = NULL;
+           }
+         channels[i]->mdata = ndata;
+       }
       bresult = ReadFile (channels[i]->cpipe_out,
-          &channels[i]->data[channels[i]->size],
-          MAX_META_DATA - channels[i]->size, &bytes_read, NULL);
+          &channels[i]->mdata[channels[i]->size],
+          channels[i]->mdata_size - channels[i]->size, &bytes_read, NULL);
       if (bresult)
         ret = EXTRACTOR_IPC_process_reply_ (channels[i]->plugin,
-            channels[i]->data, channels[i]->size + bytes_read, proc, proc_cls);
+            channels[i]->mdata, channels[i]->size + bytes_read, proc, 
proc_cls);
       if (!bresult || -1 == ret)
       {
         DWORD error = GetLastError ();
@@ -740,7 +772,7 @@
       }
       else
       {
-        memmove (channels[i]->data, &channels[i]->data[ret],
+        memmove (channels[i]->mdata, &channels[i]->mdata[ret],
           channels[i]->size + bytes_read - ret);
         channels[i]->size = channels[i]->size + bytes_read- ret;
       }




reply via email to

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