bug-make
[Top][All Lists]
Advanced

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

Re: [bug #33138] .PARLLELSYNC enhancement with patch


From: Frank Heckenbach
Subject: Re: [bug #33138] .PARLLELSYNC enhancement with patch
Date: Sat, 04 May 2013 04:42:32 +0200

Paul Smith wrote:

> I went a different way: I modified the child_error() function so that if
> there was an output-sync file, the error message would be written to the
> end of that file instead of printed directly.  This way when the output
> is shown to the user she sees the entire thing, including error messages
> from make, in order.
> 
> This also allowed me to drop the layer of enter/leave notices around
> error messages.

I see, this seems better.

I've tested your changes and so far "-O job" works for my use cases.

> PS. Some may be tsking to themselves noting this change would have been
> a lot simpler if we'd kept a FILE* handle instead of a file descriptor.
> Unfortunately it's not clear that would work.  I created a test program
> to verify that this method of having the parent append messages to the
> file after the child exits, and with a FILE* handle I couldn't make it
> work right.  My fseek() after the child exited didn't skip past the
> child's output and my message printed by the parent ended up overwriting
> that output.  I'm sure it would have worked if I'd closed the file in
> the parent and re-opened it, but since I'm using tmpfile() that is not
> possible.  I might have done something wrong, but anyway it wasn't a
> slam-dunk.

I suppose a FILE* wants to own the actual file. I haven't checked
this particular case, but it rhymes with my experience in similar
situations. FILE* seems not suited for this kind of usage.

BTW:

:   /* This is needed to avoid the "label at end of compound statement"
:      diagnostics on Posix platforms.  */

I don't think that's a POSIX thing (which is a standard about
operating systems, not compiler diagnostics), is it?

:           if (output_sync == OUTPUT_SYNC_MAKE
:               || (output_sync && !(flags & COMMANDS_RECURSE)))

:           if (output_sync && (output_sync == OUTPUT_SYNC_MAKE
:                               || !(flags & COMMANDS_RECURSE)))

These two conditions are logically equivalent, but written
differently which may be confusing later.

Also, I think in the Windows branch, the former condition also
should say just "output_sync" instead of
"output_sync == OUTPUT_SYNC_TARGET", a recent change during the
introduction of "-O job".

The following patch makes these changes and fixes a precedence bug
that had crept in during the introduction of child_out (although I
can't actually test it on VMS :).

--- job.c.orig  2013-05-04 03:19:12.000000000 +0200
+++ job.c       2013-05-04 04:08:09.000000000 +0200
@@ -536,7 +536,7 @@
   l = strlen (pre) + strlen (f->name) + strlen (post);
 
 #ifdef VMS
-  if (exit_code & 1 != 0)
+  if ((exit_code & 1) != 0)
     return;
 
   msg = error_s (l + INTEGER_LENGTH, NILF, _("%s[%s] Error 0x%x%s"),
@@ -1709,8 +1709,8 @@
 #ifdef OUTPUT_SYNC
           /* Divert child output if output_sync in use.  Don't capture
              recursive make output unless we are synchronizing "make" mode.  */
-          if (output_sync && (output_sync == OUTPUT_SYNC_MAKE
-                              || !(flags & COMMANDS_RECURSE)))
+          if (output_sync == OUTPUT_SYNC_MAKE
+              || (output_sync && !(flags & COMMANDS_RECURSE)))
             {
               int outfd = fileno (stdout);
               int errfd = fileno (stderr);
@@ -1834,8 +1834,7 @@
               child's stdout, and another one for its stderr, if they
               are separate. */
           if (output_sync == OUTPUT_SYNC_MAKE
-              || (output_sync == OUTPUT_SYNC_TARGET
-                 && !(flags & COMMANDS_RECURSE)))
+              || (output_sync && !(flags & COMMANDS_RECURSE)))
             {
               if (!assign_child_tempfiles (child, combined_output))
                {
@@ -1859,8 +1858,8 @@
 #ifdef OUTPUT_SYNC
           /* Divert child output if output_sync in use.  Don't capture
              recursive make output unless we are synchronizing "make" mode.  */
-          if (output_sync && (output_sync == OUTPUT_SYNC_MAKE
-                              || !(flags & COMMANDS_RECURSE)))
+          if (output_sync == OUTPUT_SYNC_MAKE
+              || (output_sync && !(flags & COMMANDS_RECURSE)))
            hPID = process_easy(argv, child->environment,
                                child->outfd, child->errfd);
          else



reply via email to

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