kjg@bcat1.prime.com (Ken Gartner) (02/13/91)
I have a problem running X11R4 on top of sunview under SUNOS 4.1.1. The
exact same executables work fine under SUNOS4.0.3. I do not know that much about
X so please be gentle...
Basically, standalone X11R4 works on Sparc2 and SUN3/60 machines under 4.1.1,
but if X is invoked under sunview as follows, the following happens:
foo1> trace -o foo X :0 -dev /dev/bwtwo0
WIN ioctl number 80706728: Device Busy
sunOpenFrameBuffer: Can't open new screen on /dev/bwtwo0.
Fatal server bug!
no screens found
[ The same thing happens if X is compiled on a 4.1.1 machine. ]
The error is generated in sunInit.c in server/ddx/sun:
...
/*
* If no device was specified on the command line, open the window
* specified in WINDOW_PARENT. If a device was specified, open a
* new screen on that device and use it as a parent window.
*/
if ( devsw ) {
bzero( (caddr_t)&newScreen, sizeof(newScreen) );
strcpy( newScreen.scr_fbname, name );
newScreen.scr_flags |= SCR_TOGGLEENABLE;
--> if ( (parentFd = win_screennew( &newScreen )) < 0 ) {
ErrorF( "sunOpenFrameBuffer: Can't open new screen on %s.\n",
name );
return( -1 );
...
The problem seems to be with the [win_screennew] routine in sunInit.c,
which does an ioctl on /dev/win5. In the working case, this results in
a SIGWINCH (28), in the bad case the result is EBUSY. A little examination
of the ioctl include files reveals:
open ("/dev/win5", 0200002, 0) = 8
ioctl (8, 0x80706728, 0xdfff710) = -1 EBUSY (Device busy)
in sunwindow/win_ioctl.h:
80 00 00 00 |
70 00 00 |
g 00 |
40 <-|
#define WINSCREENNEW _IOW(g, 40, struct usrdesktop)
/* Copies in usrdesktop and installs the calling window as its root.
The root window is opened before making this call (obviously).
Udt_scr.scr_name is made available to other window processes via
WINSCREENGET so that they can pass it to pr_open during pixrect
creation. The root's rect size is set to the size of scr_rect. */
in sys/ioccom.h:
#define _IOW(x,y,t) (_IOC_IN|((sizeof(t)&_IOCPARM_MASK)<<16)|('x'<<8)|y)
#define _IOC_IN 0x80000000 /* copy in parameters */
#define _IOCPARM_MASK 0xff /* parameters must be < 256 bytes */
The big questions are: 1) How does this ioctl return EBUSY? and 2)
what changed in SUNOS4.1.1 to cause this (will I see this in other
programs I have ...).
Thank you.
kjg
--
Kenneth J. Gartner | kjg@s49.prime.com
Prime Computer (CPU Group) | 1-508-620-2800 x3287
500 Old Connecticut Path, MS 10A-04
Framingham Mass, 01701
"Cursedbehewho thinks my opinions reflect Prime Official policy"