$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r78847 - trunk/tools/build/v2/engine
From: kbelco_at_[hidden]
Date: 2012-06-07 11:36:46
Author: noel_belcourt
Date: 2012-06-07 11:36:46 EDT (Thu, 07 Jun 2012)
New Revision: 78847
URL: http://svn.boost.org/trac/boost/changeset/78847
Log:
Add ability to limit amount of target output that is
output by bjam.  Added bjam argument -mx where x is
the maximum amount of output to be captured from a 
target, in kb.
This fix will enable, PGI, VACPP, and Clang to cycle
normally in the nightly testing.
Text files modified: 
   trunk/tools/build/v2/engine/execunix.c |    32 ++++++++++++++++++++++++--------        
   trunk/tools/build/v2/engine/jam.c      |     9 +++++++--                               
   trunk/tools/build/v2/engine/jam.h      |     1 +                                       
   3 files changed, 32 insertions(+), 10 deletions(-)
Modified: trunk/tools/build/v2/engine/execunix.c
==============================================================================
--- trunk/tools/build/v2/engine/execunix.c	(original)
+++ trunk/tools/build/v2/engine/execunix.c	2012-06-07 11:36:46 EDT (Thu, 07 Jun 2012)
@@ -88,6 +88,7 @@
     char   *target;           /* buffer to hold action and target invoked */
     char   *command;          /* buffer to hold command being invoked */
     char   *buffer[2];        /* buffer to hold stdout and stderr, if any */
+    int     buf_size[2];      /* size of buffer (bytes) */
     void    (*func)( void *closure, int status, timing_info*, const char *, const char * );
     void   *closure;
     time_t  start_dt;         /* start of command timestamp */
@@ -353,18 +354,31 @@
         if  ( !cmdtab[ i ].buffer[ s ] )
         {
             /* Never been allocated. */
-            cmdtab[ i ].buffer[ s ] = (char*)BJAM_MALLOC_ATOMIC( ret + 1 );
-            memcpy( cmdtab[ i ].buffer[ s ], buffer, ret + 1 );
+            if (ret <= globs.max_buf || 0 == globs.max_buf) {
+                cmdtab[ i ].buf_size[ s ] = ret + 1;
+                cmdtab[ i ].buffer[ s ] = (char*)BJAM_MALLOC_ATOMIC( ret + 1 );
+                memcpy( cmdtab[ i ].buffer[ s ], buffer, ret + 1 );
+            }
+            else {
+                ret = globs.max_buf;
+                buffer[ret] = 0;
+                cmdtab[ i ].buf_size[ s ] = ret + 1;
+                cmdtab[ i ].buffer[ s ] = (char*)BJAM_MALLOC_ATOMIC( ret + 1 );
+                memcpy( cmdtab[ i ].buffer[ s ], buffer, ret + 1);
+            }
         }
         else
         {
             /* Previously allocated. */
-            char * tmp = cmdtab[ i ].buffer[ s ];
-            len = strlen( tmp );
-            cmdtab[ i ].buffer[ s ] = (char*)BJAM_MALLOC_ATOMIC( len + ret + 1 );
-            memcpy( cmdtab[ i ].buffer[ s ], tmp, len );
-            memcpy( cmdtab[ i ].buffer[ s ] + len, buffer, ret + 1 );
-            BJAM_FREE( tmp );
+            if (cmdtab[ i ].buf_size[ s ] < globs.max_buf || 0 == globs.max_buf) {
+                char * tmp = cmdtab[ i ].buffer[ s ];
+                len = cmdtab[ i ].buf_size[ s ];
+                cmdtab[ i ].buf_size[ s ] = len + ret + 1;
+                cmdtab[ i ].buffer[ s ] = (char*)BJAM_MALLOC_ATOMIC( len + ret + 1 );
+                memcpy( cmdtab[ i ].buffer[ s ], tmp, len );
+                memcpy( cmdtab[ i ].buffer[ s ] + len, buffer, ret + 1 );
+                BJAM_FREE( tmp );
+            }
         }
     }
 
@@ -543,9 +557,11 @@
 
                         BJAM_FREE( cmdtab[ i ].buffer[ OUT ] );
                         cmdtab[ i ].buffer[ OUT ] = 0;
+                        cmdtab[ i ].buf_size[ OUT ] = 0;
 
                         BJAM_FREE( cmdtab[ i ].buffer[ ERR ] );
                         cmdtab[ i ].buffer[ ERR ] = 0;
+                        cmdtab[ i ].buf_size[ ERR ] = 0;
 
                         BJAM_FREE( cmdtab[ i ].command );
                         cmdtab[ i ].command = 0;
Modified: trunk/tools/build/v2/engine/jam.c
==============================================================================
--- trunk/tools/build/v2/engine/jam.c	(original)
+++ trunk/tools/build/v2/engine/jam.c	2012-06-07 11:36:46 EDT (Thu, 07 Jun 2012)
@@ -152,7 +152,8 @@
     { 0, 1 },   /* debug ... */
 #endif
     0,          /* output commands, not run them */
-    0           /* action timeout */
+    0,          /* action timeout */
+    0           /* maximum buffer size zero is all output */
 };
 
 /* Symbols to be defined as true for use in Jambase. */
@@ -241,7 +242,7 @@
     --argc;
     ++argv;
 
-    if ( getoptions( argc, argv, "-:l:d:j:p:f:gs:t:ano:qv", optv ) < 0 )
+    if ( getoptions( argc, argv, "-:l:m:d:j:p:f:gs:t:ano:qv", optv ) < 0 )
     {
         printf( "\nusage: %s [ options ] targets...\n\n", progname );
 
@@ -251,6 +252,7 @@
         /* printf( "-g      Build from newest sources first.\n" ); */
         printf( "-jx     Run up to x shell commands concurrently.\n" );
         printf( "-lx     Limit actions to x number of seconds after which they are stopped.\n" );
+        printf( "-mx     Maximum target output saved (kb), default is to save all output.\n" );
         printf( "-n      Don't actually execute the updating actions.\n" );
         printf( "-ox     Write the updating actions to file x.\n" );
         printf( "-px     x=0, pipes action stdout and stderr merged into action output.\n" );
@@ -318,6 +320,9 @@
     if ( ( s = getoptval( optv, 'l', 0 ) ) )
         globs.timeout = atoi( s );
 
+    if ( ( s = getoptval( optv, 'm', 0 ) ) )
+        globs.max_buf = atoi( s ) * 1024;  /* convert to kb */
+
     /* Turn on/off debugging */
     for ( n = 0; ( s = getoptval( optv, 'd', n ) ); ++n )
     {
Modified: trunk/tools/build/v2/engine/jam.h
==============================================================================
--- trunk/tools/build/v2/engine/jam.h	(original)
+++ trunk/tools/build/v2/engine/jam.h	2012-06-07 11:36:46 EDT (Thu, 07 Jun 2012)
@@ -456,6 +456,7 @@
                                  * default 0 for no limit.
                                  */
     int    dart;                /* output build and test results formatted for Dart */
+    int    max_buf;             /* maximum amount of output saved from target (kb) */
 };
 
 extern struct globs globs;