Mail Archives: cygwin/2016/06/07/08:38:18
--Multipart=_Tue__7_Jun_2016_21_37_41_+0900_hpxDGZYvbUkuZkDn
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Hi Corinna,
I have tested the latest (2016-06-06) snapshot. No problem is found.
I evaluated the response of vim in several environments using a test
case attached. This test case measures the time for
(open a file + scroll up/down 100 times + quit)
in vim.
Results are as follows.
The latest snapshot is the fastest! It's 13% faster than 2.5.1.
You did it!
Machine1: Windows 7 (64bit) + Cygwin 64bit
cygwin 2.5.1 : 1.035133 second
snapshot (2016-05-31): 58.479826 second
snapshot (2016-06-06): 0.898675 second
Machine1: Windows 7 (64bit) + Cygwin 32bit
cygwin 2.5.1 : 1.242907 second
snapshot (2016-05-31): 57.491763 second
snapshot (2016-06-06): 0.911885 second
Machine2: Windows 7 (64bit) + Cygwin 64bit
cygwin 2.5.1 : 0.688432 second
snapshot (2016-05-31): 462.305977 second
snapshot (2016-06-06): 0.596733 second
Machine2: Windows 7 (64bit) + Cygwin 32bit
cygwin 2.5.1 : 0.761117 second
snapshot (2016-05-31): 462.280320 second
snapshot (2016-06-06): 0.660631 second
Machine2: Windows 10 (64bit) + Cygwin 64bit
cygwin 2.5.1 : 0.676545 second
snapshot (2016-05-31): 0.599878 second
snapshot (2016-06-06): 0.599495 second
Machine2: Windows 10 (64bit) + Cygwin 32bit
cygwin 2.5.1 : 0.784049 second
snapshot (2016-05-31): 0.675585 second
snapshot (2016-06-06): 0.675050 second
--
Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
--Multipart=_Tue__7_Jun_2016_21_37_41_+0900_hpxDGZYvbUkuZkDn
Content-Type: text/x-csrc;
name="pty_vim.c"
Content-Disposition: attachment;
filename="pty_vim.c"
Content-Transfer-Encoding: 7bit
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pty.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/select.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <sys/time.h>
#include <time.h>
int master;
void winsize_set(void)
{
struct winsize win;
ioctl(fileno(stdin), TIOCGWINSZ, &win);
ioctl(master, TIOCSWINSZ, &win);
}
void sig_handler(int sig)
{
switch (sig) {
case SIGWINCH:
winsize_set();
break;
case SIGCHLD:
{
struct termios tt;
tcgetattr(fileno(stdout), &tt);
tt.c_oflag |= OPOST;
tt.c_lflag |= ECHO|ICANON|ISIG;
tt.c_iflag |= IXON;
tcsetattr(fileno(stdout), TCSANOW, &tt);
}
/*
printf("Child Terminated.\n");
*/
break;
}
}
int write_all(int fd, char *buf, int len)
{
int cnt = 0;
char *p = buf;
while (len > cnt) {
int ret = write(fd, p+cnt, len-cnt);
if (ret < 0) return ret;
cnt += ret;
}
return cnt;
}
int automate_vim()
{
int pm, ps;
pid_t pid;
if (openpty(&pm, &ps, NULL, NULL, NULL) < 0) {
perror("openpty()");
exit(-1);
}
master = pm; /* for signal handler */
{ /* Disable echo */
struct termios tt;
tcgetattr(ps, &tt);
tt.c_lflag &= ~ECHO;
tcsetattr(ps, TCSANOW, &tt);
}
pid = fork();
if (pid<0) {
perror("fork()");
close(pm);
exit(-1);
}
if (pid != 0) { /* Parent */
close(ps);
{ /* Setup STDIN and STDOUT */
struct termios tt;
tcgetattr(fileno(stdout), &tt);
tt.c_oflag &= ~OPOST;
tcsetattr(fileno(stdout), TCSANOW, &tt);
tcgetattr(fileno(stdin), &tt);
tt.c_lflag &= ~(ECHO|ICANON|ISIG);
tt.c_iflag &= ~IXON;
tcsetattr(fileno(stdin), TCSANOW, &tt);
}
signal(SIGWINCH, sig_handler);
signal(SIGCHLD, sig_handler);
winsize_set();
{ /* Send commands to vim */
int i;
write(pm, "1G", 2); /* Goto first line */
for (i=0; i<100; i++) {
write(pm, "\006\002", 2); /* Scroll up and down */
}
write(pm, ":q!\n", 4); /* Quit */
}
/* Process Input and Output */
for (;;) {
fd_set rdfds;
int nfd;
int r;
FD_ZERO(&rdfds);
FD_SET(pm, &rdfds);
FD_SET(fileno(stdin), &rdfds);
nfd = ((pm > fileno(stdin))? pm : fileno(stdin) ) + 1;
r = select(nfd, &rdfds, NULL, NULL, NULL);
if (r<0 && errno == EINTR) {
/*
if ( waitpid(pid, NULL, WNOHANG) == pid) break;
*/
continue;
}
if (r<=0) {
perror("select()");
close(pm);
exit(-1);
}
if (r) {
char buf[BUFSIZ];
int len;
if (FD_ISSET(pm, &rdfds)) {
len = read(pm, buf, BUFSIZ);
if (len<=0) break;
if (len > 0) {
len = write_all(fileno(stdout), buf, len);
if (len<=0) break;
}
}
if (FD_ISSET(fileno(stdin), &rdfds)) {
len = read(fileno(stdin), buf, BUFSIZ);
if (len<=0) break;
len = write_all(pm, buf, len);
if (len<=0) break;
}
}
}
wait(NULL);
close(pm);
} else { /* Child */
close(pm);
setsid();
ioctl(ps, TIOCSCTTY, 0);
dup2(ps, fileno(stdin));
dup2(ps, fileno(stdout));
dup2(ps, fileno(stderr));
close(ps);
execl("/usr/bin/vim", "vim", "pty_vim.c", NULL);
perror("execl()");
exit(-1);
}
return 0;
}
int main()
{
struct timespec tv0, tv1;
clock_gettime(CLOCK_MONOTONIC, &tv0);
automate_vim();
clock_gettime(CLOCK_MONOTONIC, &tv1);
printf("Total: %f second\n",
(tv1.tv_sec - tv0.tv_sec) + (tv1.tv_nsec - tv0.tv_nsec)*1e-9);
return 0;
}
--Multipart=_Tue__7_Jun_2016_21_37_41_+0900_hpxDGZYvbUkuZkDn
Content-Type: text/plain; charset=us-ascii
--
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
--Multipart=_Tue__7_Jun_2016_21_37_41_+0900_hpxDGZYvbUkuZkDn--
- Raw text -