[comp.windows.x] Xqdss server hangs + fix

tim@appenzell.cs.wisc.edu (Tim Theisen) (05/05/90)

I have found and resolved a problem where he Xqdss server hangs and must
be terminated with a kill -9.  The problem occurs most often when using
xdvi.  However, other clients can hang the server too.  This patch is
in use on 75 machines at the University of Wisconsin-Madison.

Hope this helps, ...Tim

Tim Theisen             Department of Computer Sciences
tim@cs.wisc.edu         University of Wisconsin-Madison
uwvax!tim               1210 West Dayton Street
(608)262-0438           Madison, WI   53706

			  X Window System Bug Report
			    xbugs@expo.lcs.mit.edu


VERSION:
    R4

CLIENT MACHINE and OPERATING SYSTEM:
    uVax 3200 running Ultrix 3.1 
        (OS not important problems occurs with BSD4.3 too.)

DISPLAY TYPE:
    Digital QDSS

WINDOW MANAGER:
    twm (doesn't matter)

AREA:
    server

SYNOPSIS:
    The Xqdss server hangs when using xdvi.

DESCRIPTION:
    The server hangs when painting bitmaps to the screen.  The problem
    is that GPX hardware sometimes hangs when executing PTOBXYCLEAN.  The
    old code would set up the GPX for a bitmap transfer, transfer the
    bitmap part and then reset (clean) the GPX state after the transfer.
    Large bitmaps would be transferred in multiple dma packets.  The solution
    is to invoke the PTOBXYCLEAN after all the bitmap parts have been
    transferred.  In addition, the state of the GPX must settle before
    issuing the clean.  Therefore the dma queue is flushed after the
    last bitmap packet.  The PTOBXYCLEAN is the first call in the next
    packet.

    I have also made changes to correctly account for the PTOBOVERHEAD.
    I found a similar error in tloffscreen.c.  (The tloffscreen error
    does not actually cause any problem.  However, it is possible that
    more packets than necessary might be used to load an off screen
    bitmap.)

    In addition, comments elsewhere in the code indicate that the GPX
    has problems if the bitmap transferred is entirely clipped.  The routine
    checked for this condition in y.  I added a corresponding check to
    clipping in the x direction.

REPEAT BY:
    Compile xdvi with the -DBUTTON flag.  Preview a page.  When the page is
    painting to the screen, moved the cursor up and down over the buttons
    causing them to highlight.  The server usually does not finish the first
    page before it hangs.

SAMPLE FIX:

    Apply the following path in the mit/server/ddx/dec/libtl directory.

*** /tmp/,RCSt1a13498	Thu May  3 10:50:06 1990
--- tloffscreen.c	Wed May  2 10:36:54 1990
***************
*** 478,486 ****
       */
      nlongsscanline = LONGSPADDED( x0, width);
      /*
!      * save 15 words for setup display list
       */
!     nscansperblock = ( min( req_buf_size, MAXDMAPACKET/sizeof(short)) - 15 )
  						/ (nlongsscanline<<1);
      blockstride = nscansperblock*nlongsscanline;
      for (nscansdone=0;
--- 478,486 ----
       */
      nlongsscanline = LONGSPADDED( x0, width);
      /*
!      * save 11 words for setup display list
       */
!     nscansperblock = ( min( req_buf_size, MAXDMAPACKET/sizeof(short)) - 11 )
  						/ (nlongsscanline<<1);
      blockstride = nscansperblock*nlongsscanline;
      for (nscansdone=0;
*** /tmp/,RCSt1a13498	Thu May  3 10:50:16 1990
--- tlptobmask.c	Wed May  2 10:40:49 1990
***************
*** 37,45 ****
  
  
  #ifdef BICHROME
! # define PTOBOVERHEAD	 NMASKSHORTS + 12 + 8 + 2*NCOLORSHORTS
  #else
! # define PTOBOVERHEAD	 NMASKSHORTS + 12 + 7 + 1*NCOLORSHORTS
  #endif
  
  /*
--- 37,45 ----
  
  
  #ifdef BICHROME
! # define PTOBOVERHEAD	 (4 + 2*NCOLORSHORTS + 12)
  #else
! # define PTOBOVERHEAD	 (4 + 1*NCOLORSHORTS + 12)
  #endif
  
  /*
***************
*** 61,70 ****
--- 61,72 ----
      int		x0, y0;
      BoxPtr	box;		/* clipping */
   {
+     register unsigned short *p;
      unsigned short *	pshort = (unsigned short *) QD_PIX_DATA(qbit);
      int			slwidthshorts = qbit->devKind>>1;
      int			height = QDPIX_HEIGHT(qbit);
      int			width = QDPIX_WIDTH(qbit);
+     int 		tw;
      int 		nscansperblock;
      unsigned short *	buf;
  
***************
*** 83,88 ****
--- 85,92 ----
      if (y0 + height > box->y2)
  	height = box->y2 - y0;
      if (height <= 0) return;
+     tw = min( box->x2, x0+width) - max( box->x1, x0);
+     if (tw <= 0) return;
  
      if ((x0 & 0xF) != 0) {
  	/* must shift */
***************
*** 98,107 ****
      else
  	buf = NULL;
      nscansperblock = ( min( req_buf_size, MAXDMAPACKET / sizeof(short))
! 		     - 50 - PTOBOVERHEAD - slwidthshorts) / slwidthshorts;
  
      for (; ; ) {
- 	register unsigned short *p;
  	int curHeight = min(nscansperblock, height);
  	register unsigned	nshort = slwidthshorts * curHeight;
  	height -= curHeight;
--- 102,110 ----
      else
  	buf = NULL;
      nscansperblock = ( min( req_buf_size, MAXDMAPACKET / sizeof(short))
! 		     - PTOBOVERHEAD) / slwidthshorts;
  
      for (; ; ) {
  	int curHeight = min(nscansperblock, height);
  	register unsigned	nshort = slwidthshorts * curHeight;
  	height -= curHeight;
***************
*** 162,175 ****
  	*p++ = 0x06000 | (0x01fff & -nshort);
  	bcopy( pshort, p, nshort<<1);
  	p += nshort;
- 	*p++ = JMPT_PTOBXYCLEAN;
- #ifdef BICHROME
- 	if (pGC->alu == GXcopy)
- 	    *p++ = JMPT_RESET_FORE_BACK;
- #else
- 	*p++ = JMPT_SETMASK;
- 	*p++ = 0xFFFF;
- #endif
  	Confirm_dma ();
  
  	if (height <= 0) break;
--- 165,170 ----
***************
*** 176,182 ****
--- 171,188 ----
  	y0 += nscansperblock;
  	pshort += nscansperblock*slwidthshorts;
      }
+     dmafxns.flush (TRUE);
      if (buf) { DEALLOCATE_LOCAL(buf); }
+     Need_dma(3);
+     *p++ = JMPT_PTOBXYCLEAN;
+ #ifdef BICHROME
+     if (pGC->alu == GXcopy)
+         *p++ = JMPT_RESET_FORE_BACK;
+ #else
+     *p++ = JMPT_SETMASK;
+     *p++ = 0xFFFF;
+ #endif
+     Confirm_dma ();
  }
  
  #ifdef BICHROME		/* only one instance of bitmapShiftRight in library */
--
Tim Theisen             Department of Computer Sciences
tim@cs.wisc.edu         University of Wisconsin-Madison
uwvax!tim               1210 West Dayton Street
(608)262-0438           Madison, WI   53706