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

Reply via email to