A_LEAO%INESCN.RCCN.PT@MITVMA.MIT.EDU (Ana Leao) (12/29/89)
I am developing a graphical editor that must display a bitmap file
received from a scanner and, after an editing session, store it back
in a file.
I am having trouble using XPutImage() and XGetImage(), as those
functions sometimes cause an I/O error (broken pipe) that kills my
program. The crashes seem to occur randomly. The size of my images
is about 100K, but I also got crashes with 15K images.
I work on a Sun3/50, diskless, running X11R3.
From the Unix Network Communications Interface (sockets) I used
both the AF_INET family (TCP/IP) and the AF_UNIX family.
I enclose a minimal program that exemplifies my problem. It
contains a loop that calls XGetImage() a thousand times, in order
to make a crash highly probable. However, sometimes those thousand
times aren't enough to cause one.
I would appreciate any suggestion.
/*-------------------------------------------------------*/
/* Author: Ana Maria de Sa' Carneiro Leao, Inesc Norte
* Filename: test.c
* File Version: 1.00
* File History: 19/12/89
*/
#include <stdio.h>
#include <X11/Xlib.h>
main(argc, argv)
int argc;
char **argv;
{
Display *display;
int screen;
Window canvas;
Pixmap bitmap;
XImage *image;
FILE *out;
char *filename = "image";
int format = XYPixmap, i, size;
unsigned long planes = AllPlanes;
unsigned int width = 1500, height = 1500,
depth = 1, buffer_size;
if ((display = XOpenDisplay(0)) == (Display *)0) {
printf("Cannot open display: %s\n", getenv("DISPLAY"));
exit(-1);
}
screen = DefaultScreen(display);
canvas = XCreateSimpleWindow(display, RootWindow(display, screen), 0, 0,
width, height, 0,
WhitePixel(display, screen),
BlackPixel(display, screen));
XMapWindow(display, canvas);
bitmap = XCreatePixmap(display, canvas, width, height, depth);
for(i = 0; i < 1000 ; i++){
if(!(image = XGetImage (display, bitmap,
0, 0, width, height, planes, format))){
printf ("Unable to get image.");
exit(1);
}
XDestroyImage(image);
if (!(i % 10)){
printf("%d\t", i);
fflush(stdout);
}
}
if(!(image = XGetImage (display, bitmap,
0, 0, width, height, planes, format))){
printf ("Unable to get image.");
exit(1);
}
if ((out = fopen(filename, "w")) == NULL){
XDestroyImage(image);
printf("Can't open output file.\n");
exit(1);
}
buffer_size = image->bytes_per_line * image->height * image->depth;
if((size = fwrite(image->data, 1, (int)buffer_size, out)) != (int)buffer_size)
printf("Error writing image.\n");
XDestroyImage(image);
fclose(out);
}