[Search for users] [Overall Top Noters] [List of all Conferences] [Download this site]

Conference bulova::decw_jan-89_to_nov-90

Title:DECWINDOWS 26-JAN-89 to 29-NOV-90
Notice:See 1639.0 for VMS V5.3 kit; 2043.0 for 5.4 IFT kit
Moderator:STAR::VATNE
Created:Mon Oct 30 1989
Last Modified:Mon Dec 31 1990
Last Successful Update:Fri Jun 06 1997
Number of topics:3726
Total number of notes:19516

1888.0. "Memory Leak?? XGetImage/XDeleteImage" by CSC32::HADDOCK (The Seventh Son) Mon Dec 11 1989 12:08

    It appesrs that XGetImage and XDeleteImage may have a memory
    leak.  The following code demonstrates the problem.  The size
    of the image must change each time through the loop, and the
    virtual pages (show proc/cont) will increase only about every
    20 times through the XGetImage/XDeleteImage loop.  I have
    tested this on VMS 5.3 with the same results.  Can anyone
    confirm this?  If so, can anyone give a time table for when
    this may be fixed?
    Thanks in advance,
    fred();
    
    Cut here-------------------------------------------------------*
       IMPLICIT NONE
       INCLUDE 'SYS$LIBRARY:DECW$XLIBDEF.FOR'
 
! Constants
 
       PARAMETER WINDOW_WIDTH=550
       PARAMETER WINDOW_HEIGHT=250
       PARAMETER BORDER_WIDTH=1

! Variables
       INTEGER*4 DISPLAY        ! display pointer
       INTEGER*4 WINDOW         ! application window id
       INTEGER*4 SCREEN_NUMBER  ! screen number
       INTEGER*4 ROOT_WINDOW    ! root window
       INTEGER*4 DISPLAY_WIDTH  ! witdth of the display
       INTEGER*4 DISPLAY_HEIGHT ! height of the display
       INTEGER*4 X_OFFSET       ! x offset of the window
       INTEGER*4 Y_OFFSET       ! y offset of the window
       INTEGER*4 BLACK_PIXEL    ! black pixel color value
       INTEGER*4 WHITE_PIXEL    ! white pixel color value
       INTEGER*4 GC		! graphics context
       INTEGER*4 PIX		! pixmap for backing store
       INTEGER*4 LAST_TIME	! time stamp
       INTEGER*4 DEPTH		! default depth
       INTEGER*4 FUNCT		! dummy variable for X$synchronize
       INTEGER*4 STATUS, I
       LOGICAL*1 LOOP		! main loop indicator
       RECORD /X$EVENT/ XEVENT  	! event structure
       RECORD /X$POINT/ POINTS(5)	! points array
       RECORD /X$IMAGE/ XIMAGE

   ! Open the default display

       DISPLAY = X$OPEN_DISPLAY('wilbil::0.0')
       IF (DISPLAY .EQ. 0) STOP 'EXIT #1--CAN''T OPEN DISPLAY'

   ! Synchronize for debugging
       CALL X$SYNCHRONIZE( DISPLAY, 1, FUNCT)
 
   ! get screen number
       SCREEN_NUMBER = X$DEFAULT_SCREEN( DISPLAY )
 
   ! get the root window
       ROOT_WINDOW = X$ROOT_WINDOW( DISPLAY, SCREEN_NUMBER)
 
   ! get the display width and height
       DISPLAY_WIDTH = X$DISPLAY_WIDTH( DISPLAY, SCREEN_NUMBER)
       DISPLAY_HEIGHT= X$DISPLAY_HEIGHT( DISPLAY, SCREEN_NUMBER)

   ! initial position of window
       X_OFFSET = DISPLAY_WIDTH/3
       Y_OFFSET = DISPLAY_HEIGHT/3
 
   ! get pixel color values
       BLACK_PIXEL = X$BLACK_PIXEL( DISPLAY, SCREEN_NUMBER)
       WHITE_PIXEL = X$WHITE_PIXEL( DISPLAY, SCREEN_NUMBER)
 
   ! Create a simple window on the screen 
       WINDOW = X$CREATE_SIMPLE_WINDOW (
     1        DISPLAY,             !/* pointer to display info */
     1        ROOT_WINDOW,         !/* parent window id */
     1        X_OFFSET,            !/* x offset from parent origin */
     1        Y_OFFSET,            !/* y offset from parent origin */
     1        WINDOW_WIDTH,        !/* width */
     1        WINDOW_HEIGHT,       !/* height */
     1        BORDER_WIDTH,        !/* border width */
     1        BLACK_PIXEL,         !/* border color */
     1        WHITE_PIXEL )        !/* background color */
       IF (WINDOW .EQ. 0) STOP 'EXIT #2--COULD NOT CREATE WINDOW'
 
   ! Map the window, causing it to become visible 
       CALL X$MAP_WINDOW( DISPLAY, WINDOW )

   ! Select button_press and expose events on window
       CALL X$SELECT_INPUT( DISPLAY, WINDOW, 
	1	X$M_BUTTON_PRESS .OR. X$M_EXPOSURE)


   ! Default graphics context 
       GC = X$DEFAULT_GC( DISPLAY, SCREEN_NUMBER)

   ! Draw something on the screen       
       POINTS(1).X$W_GPNT_X = 50
       POINTS(1).X$W_GPNT_Y = 50
       POINTS(2).X$W_GPNT_X = 200
       POINTS(2).X$W_GPNT_Y = 50
       POINTS(3).X$W_GPNT_X = 200
       POINTS(3).X$W_GPNT_Y = 200
       POINTS(4).X$W_GPNT_X = 50
       POINTS(4).X$W_GPNT_Y = 200
       POINTS(5).X$W_GPNT_X = 50
       POINTS(5).X$W_GPNT_Y = 50
       CALL X$DRAW_LINES( DISPLAY, WINDOW, GC, POINTS, 5,
	1	X$C_COORD_MODE_ORIGIN )

   ! Save the window in "backing store"
       CALL X$SET_FUNCTION( DISPLAY, GC, X$C_GX_COPY)

! Must chage size of pixmap each time
      DO I = 1,200
         TYPE *, I		
         STATUS = X$GET_IMAGE( DISPLAY, WINDOW, 0, 0, 500-I, 200-I, 
	1	X$ALL_PLANES(), X$C_XY_PIXMAP, XIMAGE )

! Adding call to X$FREE didn't help
!         CALL X$FREE(XIMAGE.X$A_IMAG_DATA)

         STATUS = X$DESTROY_IMAGE( XIMAGE )
      ENDDO


   ! Enter main loop
       LOOP = .TRUE.	!initialize loop indicator
       DO WHILE (LOOP)
 
          CALL X$NEXT_EVENT( DISPLAY, xEVENT)
! Checked for extra events (debug).  Did not see any.

       ENDDO

       CALL LIB$WAIT(5.0)
       STOP
 
       END
    
T.RTitleUserPersonal
Name
DateLines
1888.1Only a guessSTAR::ORGOVANVince OrgovanWed Dec 13 1989 18:2314
    I suspect that this problem may be unique to the VAX binding
    style of the X$DESTROY_IMAGE routine. Please QAR this.
    
    As a workaround, you might try converting to the MIT style
    entry point for this routine:
    
    	INTEGER*4 XDESTROYIMAGE
    	EXTERNAL XDESTROYIMAGE
    
    		o
    		o
    		o
    
        STATUS = XDESTROYIMAGE( XIMAGE )
1888.2no joyCSC32::HADDOCKThe Seventh SonThu Dec 14 1989 11:033
    I tried changing to XDESTROYIMAGE().  It did not change the behavior.
    I will send QAR.
    fred();