On 5/30/2016 4:02 PM, Ken Brown wrote:
On 5/26/2016 8:31 AM, Ken Brown wrote:
This looks like a bug I reported several years ago; it actually has
nothing to do with emacs:
https://www.cygwin.com/ml/cygwin/2011-10/msg00445.html
It was fixed but then reappeared some months later:
https://www.cygwin.com/ml/cygwin/2012-05/msg00049.html
It was fixed again but apparently is back. The test case from the
original report still exhibits the problem.
I've tracked down the commits that fixed this bug in the past. The first fix
was
commit 31d2bedc585420092eb53895c5f5646651f13215
Author: Christopher Faylor <m...@cgf.cx>
Date: Sun Oct 23 19:01:47 2011 +0000
* fhandler_tty.cc (fhandler_pty_slave::read): Use consistent way for testing
ReadFile return.
* pipe.cc (fhandler_pipe::create_selectable): Open the write side of the
pipe
in message-mode to force writing as "chunks". Explain why.
The second was
commit fb9d631817cc2b5d83c2a6ff928851d201c992bf
Author: Christopher Faylor <m...@cgf.cx>
Date: Fri May 4 03:00:43 2012 +0000
* DevNotes: Add entry cgf-000002.
* fhandler_tty.cc (bytes_available): Revert to previous Oct-2011 behavior
where
a dummy buffer is used to determine how many bytes will be read.
(fhandler_pty_master::ioctl): Correct coercion in assignment.
A few weeks later the code was simplified:
commit bd8afa5eb160b56715b805befe850a5ba2131d28
Author: Christopher Faylor <m...@cgf.cx>
Date: Wed May 16 01:56:41 2012 +0000
* DevNotes: Add entry cgf-000008.
* fhandler_tty.cc (bytes_available): Simplify by returning the number of
bytes
available in the message unless that is zero.
I've looked at the current code in the vicinity of these changes, and nothing
jumps out at me as obviously breaking the previous fixes; but that doesn't mean
much.
FWIW, if I take my original test case, as modified by cgf, and uncomment
the line "sleep (1);", then the program finishes successfully. I don't
know if that provides a clue.
For convenience, I'm attaching the modified test case.
Ken
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pty.h>
#include <string.h>
#include <sys/wait.h>
void get_output (int fd);
int
main (int argc, const char **argv)
{
int master;
pid_t pid;
if ((pid = forkpty (&master, NULL, NULL, NULL)) < 0)
{
perror ("forkpty");
exit (1);
}
/* child */
if (pid == 0)
{
const char *av[100];
// putenv ("HOME=/tmp");
int i = 0;
#ifdef STRACE_GDB
av[i++] = "strace";
av[i++] = "-o";
av[i++] = "/tmp/strace.out";
#ifdef __CYGWIN__
av[i++] = "--mask=all+paranoid";
#endif
#endif
av[i++] = argv[1] ?: "gdb";
fprintf (stderr, "*** using %s\n", av[0]);
av[i++] = "-i=mi";
av[i] = NULL;
execvp (av[0], (char * const *) av);
/* shouldn't get here */
exit (1);
}
/* parent */
const char *input[20];
int i = 0;
input[i++] = "1-inferior-tty-set /dev/pty3\n";
input[i++] = "2-gdb-set height 0\n";
input[i++] = "3-gdb-set non-stop 1\n";
input[i++] = "4-file-list-exec-source-files\n";
input[i++] = "5-file-list-exec-source-file\n";
input[i++] = "6-gdb-show prompt\n";
input[i++] = "7-stack-info-frame\n";
input[i++] = "8-thread-info\n";
input[i++] = "9-break-list\n";
input[i++] = "q\n";
input[i] = NULL;
for (int i = 0; input[i]; ++i)
{
write (master, input[i], strlen (input[i]));
sleep (1);
}
get_output (master);
wait (NULL);
}
void
get_output (int fd)
{
char buf[4096];
while (1)
{
int nread = read (fd, buf, sizeof (buf));
if (nread > 0)
write (STDOUT_FILENO, buf, nread);
else
{
printf ("No more output. nread %d\n", nread);
break;
}
}
}
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple