diff src/callproc.c @ 62982:d7793ac6df62

(Fcall_process): Don't use alloca to gradually increase size of buf, as it effectively uses twice the necessary space on the stack. Instead, pre-allocate buf of full size, and gradually increase the read size.
author Kim F. Storm <storm@cua.dk>
date Fri, 03 Jun 2005 23:02:40 +0000
parents 8881d5e2d23f
children a8fa7c632ee4 01137c1fdbe9
line wrap: on
line diff
--- a/src/callproc.c	Fri Jun 03 23:02:30 2005 +0000
+++ b/src/callproc.c	Fri Jun 03 23:02:40 2005 +0000
@@ -218,9 +218,10 @@
   int fd[2];
   int filefd;
   register int pid;
-  char buf[16384];
-  char *bufptr = buf;
-  int bufsize = sizeof buf;
+#define CALLPROC_BUFFER_SIZE_MIN (16 * 1024)
+#define CALLPROC_BUFFER_SIZE_MAX (4 * CALLPROC_BUFFER_SIZE_MIN)
+  char buf[CALLPROC_BUFFER_SIZE_MAX];
+  int bufsize = CALLPROC_BUFFER_SIZE_MIN;
   int count = SPECPDL_INDEX ();
 
   register const unsigned char **new_argv
@@ -765,7 +766,7 @@
 	nread = carryover;
 	while (nread < bufsize - 1024)
 	  {
-	    int this_read = emacs_read (fd[0], bufptr + nread,
+	    int this_read = emacs_read (fd[0], buf + nread,
 					bufsize - nread);
 
 	    if (this_read < 0)
@@ -790,7 +791,7 @@
 	if (!NILP (buffer))
 	  {
 	    if (! CODING_MAY_REQUIRE_DECODING (&process_coding))
-	      insert_1_both (bufptr, nread, nread, 0, 1, 0);
+	      insert_1_both (buf, nread, nread, 0, 1, 0);
 	    else
 	      {			/* We have to decode the input.  */
 		int size;
@@ -807,7 +808,7 @@
 		   requires text-encoding detection.  */
 		if (process_coding.type == coding_type_undecided)
 		  {
-		    detect_coding (&process_coding, bufptr, nread);
+		    detect_coding (&process_coding, buf, nread);
 		    if (process_coding.composing != COMPOSITION_DISABLED)
 		      /* We have not yet allocated the composition
 			 data because the coding type was undecided.  */
@@ -816,7 +817,7 @@
 		if (process_coding.cmp_data)
 		  process_coding.cmp_data->char_offset = PT;
 
-		decode_coding (&process_coding, bufptr, decoding_buf,
+		decode_coding (&process_coding, buf, decoding_buf,
 			       nread, size);
 
 		if (display_on_the_fly
@@ -905,7 +906,7 @@
 		if (carryover > 0)
 		  /* As CARRYOVER should not be that large, we had
 		     better avoid overhead of bcopy.  */
-		  BCOPY_SHORT (bufptr + process_coding.consumed, bufptr,
+		  BCOPY_SHORT (buf + process_coding.consumed, buf,
 			       carryover);
 		if (process_coding.result == CODING_FINISH_INSUFFICIENT_CMP)
 		  {
@@ -922,17 +923,13 @@
 	if (process_coding.mode & CODING_MODE_LAST_BLOCK)
 	  break;
 
+#if (CALLPROC_BUFFER_SIZE_MIN != CALLPROC_BUFFER_SIZE_MAX)
 	/* Make the buffer bigger as we continue to read more data,
-	   but not past 64k.  */
-	if (bufsize < 64 * 1024 && total_read > 32 * bufsize)
-	  {
-	    char *tempptr;
-	    bufsize *= 2;
-
-	    tempptr = (char *) alloca (bufsize);
-	    bcopy (bufptr, tempptr, bufsize / 2);
-	    bufptr = tempptr;
-	  }
+	   but not past CALLPROC_BUFFER_SIZE_MAX.  */
+	if (bufsize < CALLPROC_BUFFER_SIZE_MAX && total_read > 32 * bufsize)
+	  if ((bufsize *= 2) > CALLPROC_BUFFER_SIZE_MAX)
+	    bufsize = CALLPROC_BUFFER_SIZE_MAX;
+#endif
 
 	if (display_p)
 	  {