Subject: re: CVS commit: src/sys/kern
To: None <christos@zoulas.com>
From: YAMAMOTO Takashi <yamt@mwd.biglobe.ne.jp>
List: tech-net
Date: 07/02/2006 21:37:26
[ moved from source-changes@ ]
> | > Module Name: src
> | > Committed By: christos
> | > Date: Sat Jul 1 15:38:28 UTC 2006
> | >
> | > Modified Files:
> | > src/sys/kern: uipc_socket2.c
> | >
> | > Log Message:
> | > Revert previous change to bump the socket low watermark to sock_loan_thresh.
> | > With sock_loan_thresh=4096, sb_lowat==sb_hiwat, and sowritable will never
> | > be true (even if only a single byte is pending). Some programs (like screen)
> | > expect select() to return that a socket is writable on a socket when there
> | > is space to write to it. XXX: What is the right thing to do here?
> |
> | i guess the right thing is fixing the configure script...
> |
> |
> | why is it wrong?
>
> This is the script; it writes 4 bytes to the socket, and expects that
> the second select will return 2, one for the socket being readable,
> and one for being writable. The socket "sowritable" test will always
> fail if sb_hiwat == sb_lowat and there are bytes in the queue.
>
> Another way to "fix" the problem is to increase the high watermark
> if not set to be lowat + MCLBYTES.
>
> christos
why MCLBYTES?
i don't want to tweak kernel for a configure script.
is there any other application which is known to have a problem?
YAMAMOTO Takashi
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
>
> char *nam = "/tmp/conftest20904";
>
> main()
> {
> fd_set f;
> int rv = 0;
>
> (void)alarm(5);
> unlink(nam);
> if (mkfifo(nam, 0777))
> exit(1);
> close(0);
> if (open(nam, O_RDWR | O_NONBLOCK))
> exit(1);
> if (write(0, "TEST", 4) == -1)
> exit(1);
>
> FD_SET(0, &f);
> if (select(1, &f, 0, 0, 0) == -1)
> rv = 1;
> if (select(1, &f, &f, 0, 0) != 2)
> rv = 1;
> return 0;
> }