On Thu, 2021-08-19 at 19:59 +0100, Iain Sandoe wrote: > Hi, > > Preface: > > this is the last patch for now in my series - with this applied > Darwin > reports the same results as Linux (at least, for modern x86_64 > platform versions). > > Note > a) that the expect expression in {fixed}host_execute seems to depend > on the assumption that the dejagnu.h output is used by the testcase > and that the executable’s output can be seen to end with the totals > produced there (which might in itself be erroneous, see 3). > > b) the main GCC testsuite processing does not do this; rather the > expect > expression is somewhat simple and the output from the executable > is copied into a secondary buffer, which is then processed by > prune expressions and then to find the requisite matches (so most > of the issues seen below do not occur there). > > ==== patch discussion > > The current 'fixed_host_execute' implementation fails on Darwin > platforms for a number of reasons: > > 1/ If the sub-process spawn fails (e.g. because of missing or mal- > formed params); rather than reporting the fail output into the > match stream, as indicated by the expect manual, it terminates > the script. > > - We fix this by (a) checking that the executable is valid as well > as existing (b) we put the spawn into a catch block and report > a failure. > > 2/ There is no recovery path at all for a buffer-full case (and we > do see buffer-full events with the default sizes). > > - Added by the patch here, however it is not as sophisticated as > the methods used by dejagnu internally. Here we set the process > to be "nowait" and then close the connection - with the intent > that this will terminate the spawned process. > > 3/ The expect logic assumes that 'Totals:' is a valid indicator > for the end of the spawned process output. This is not true > even for the default dejagnu header (there are a number of > additional reporting lines after). In addition to this, there > are some tests that intentionally produce more output after > the totals report (and there are tests that do not use that > mechanism at all). > > The effect is the we might arrive at the "wait" for the spawned > process to finish - but that process might not have completed > all its output. For Darwin, at least that causes a deadlock > between expect and the spawnee - the latter is doing a non- > cancellable write and the former is waiting for the latter to > terminate. For some reason this does not seem to affect Linux > perhaps the pty implementation allows the write(s) are able to > proceed even though there is no reader. > > - This is fixed by modifying the loop termination condition to be > either EOF (which will be the 'correct' condition) or a timeout > which would represent an error either in the runtime or in the > parsing of the output. As added precautions, we only try to > wait if there is a correcly-spawned process, and we are also > specific about which process we are waiting for. > > 4/ Darwin appears to have a bug in either the tcl or termios > 'cooking' code that ocassionally inserts an additional CR char > into the stream - thus '\n' => '\r\r\n' instead of '\r\n'. The > original program output is correct (it only contains a single > \n) - the additional character is being inserted somewhere in > the translations applied before the output reaches expect. > > The logic of this expect implementation does not tolerate single > \r or \n characters (it will fail with a timeout or buffer-full > if that occurs). > > - This is fixed by having a line-end match that is adjusted for > Darwin. > > 5/ The default buffer size does seem to be too small in some cases > noting that GCC uses 10000 as the match buffer size and the > default is 2000. > > - Fixed by increasing the size to 8192. > > 6/ There is a somewhat arbitrary dumping of output where we match > ^$prefix\tSOMETHING... and then process the something. This > essentially allows the match to start at any place in the buffer > following any collection of non-line-end chars. > > - Fixed by amending the match for 'general' lines to accommodate > these cases, and reporting such lines to the log. At least this > should allow debugging of any cases where output that should be > recognized is being dropped. > > tested on i686, x86_64-darwin, x86_64,powerpc64-linux,
Which versions of DejaGnu, BTW? > OK for master? Did you try this with RUN_UNDER_VALGRIND set? Assuming that that still works, yes, looks good to me. Thanks for the patch Dave