I have some strange behaviour occurring on Solaris 10 I am getting XIO errors
I Did a syscal trace and got this in part \
uname(0x7FD5EA54) = 1 uname(0x7FD5EB24) = 1 xstat(2, "/tmp/.X11-pipe/X0", 0x7FD5EF64) = 0 open("/tmp/.X11-pipe/X0", O_RDWR) = 11 ioctl(11, I_CANPUT, 0x00000000) = 1 uname(0x7FD5EA94) = 1 uname(0x7FD5EAC4) = 1 fcntl(11, F_SETFD, 0x00000001) = 0 access("/usr2/robert/.Xauthority", R_OK) = 0 open("/usr2/robert/.Xauthority", O_RDONLY) = 14 fstat64(14, 0x7FD5EC40) = 0 fstat64(14, 0x7FD5EB80) = 0 ioctl(14, TCGETA, 0x7FD5EC14) Err#25 ENOTTY read(14, "\0\0\004C0A80305\001 0\0".., 8192) = 1174 read(14, 0x080C413C, 8192) = 0 llseek(14, 0, SEEK_CUR) = 1174 close(14) = 0 writev(11, 0x7FD5F6F4, 4) = 48 fcntl(11, F_GETFL) = 2 fcntl(11, F_SETFL, FWRITE|FNONBLOCK) = 0 read(11, 0x7FD5F7AC, 8) Err#11 EAGAIN XIO: fatal IO error write(2, " X I O : f a t a l ".., 21) = 21 0 (write(2, " 0 (", 3) = 3 Error 0write(2, " E r r o r 0", 7) = 7 ) on X server "write(2, " ) o n X s e r v e".., 15) = 15 :0.0write(2, " : 0 . 0", 4) = 4 " write(2, " "\r\n", 3) = 3 after write(2, " a f t e r ", 12) = 12 0write(2, " 0", 1) = 1 requests (write(2, " r e q u e s t s (", 11) = 11 0write(2, " 0", 1) = 1 known processed) with write(2, " k n o w n p r o c e".., 23) = 23 0write(2, " 0", 1) = 1 events remaining. write(2, " e v e n t s r e m a".., 20) = 20 _exit(1)
The last X IO operation before the fatal error was called was a read n the X pipe which return error EAGAIN
The Man page for read(2) says the following
When attempting to read from an empty pipe (or FIFO):
o If no process has the pipe open for writing, read() returns 0 to indicate end-of-file.
o If some process has the pipe open for writing and O_NDELAY is set, read() returns 0.
o If some process has the pipe open for writing and O_NONBLOCK is set, read() returns -1 and sets errno to EAGAIN.
So, Its quite possible, likely that the X Server has the pipe open for writing but the pipe is empty which would return EAGAIN, why is this then treated as an error ???
More later.... Bob
Robert Lunnon bobl@optushome.com.au writes:
read(11, 0x7FD5F7AC, 8) Err#11 EAGAIN XIO: fatal IO error write(2, " X I O : f a t a l ".., 21) = 21 0 (write(2, " 0 (", 3) = 3 Error 0write(2, " E r r o r 0", 7) = 7 ) on X server "write(2, " ) o n X s e r v e".., 15) = 15 :0.0write(2, " : 0 . 0", 4) = 4 " write(2, " "\r\n", 3) = 3 after write(2, " a f t e r ", 12) = 12 0write(2, " 0", 1) = 1 requests (write(2, " r e q u e s t s (", 11) = 11 0write(2, " 0", 1) = 1 known processed) with write(2, " k n o w n p r o c e".., 23) = 23 0write(2, " 0", 1) = 1 events remaining. write(2, " e v e n t s r e m a".., 20) = 20 _exit(1)
The last X IO operation before the fatal error was called was a read n the X pipe which return error EAGAIN
The problem is that Xlib doesn't see the right errno value. It's a threading issue.