[Search for users]
[Overall Top Noters]
[List of all Conferences]
[Download this site]
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.R | Title | User | Personal Name | Date | Lines |
---|
1888.1 | Only a guess | STAR::ORGOVAN | Vince Orgovan | Wed Dec 13 1989 18:23 | 14 |
| 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.2 | no joy | CSC32::HADDOCK | The Seventh Son | Thu Dec 14 1989 11:03 | 3 |
| I tried changing to XDESTROYIMAGE(). It did not change the behavior.
I will send QAR.
fred();
|