Index:
[thread]
[date]
[subject]
[author]
From: Dennis Taylor <corbeau@execpc.com>
To : ggi-develop@eskimo.com
Date: Sun, 14 Mar 1999 23:02:27 -0600
giiClose() coredump
So I wrote a really simple test GGI2D program the other night
to see how GGI2D handles some weird cases in the even-odd
algorithm. It compiles and runs fine in the X target... but when it
exits, it coredumps on giiClose() with what looks like a problem in
X. I figure, given that I know pretty much zero about X programming,
that I should post it here and see if this will be transparent to
someone with a higher clue factor. Here's the source code of the
program (yeah, it's a bit messy, but it's just a test):
#include <stdio.h>
#include <ggi/ggi.h>
#include <ggi/ggi2d.h>
#define DEF_X 640
#define DEF_Y 480
#define DEF_DEPTH GT_16BIT
ggi2d_coord diamond[ 4 ] = { { 100, 0 },
{ 200, 100 },
{ 100, 200 },
{ 0, 100 }, };
int main( void ) {
int err;
ggi_mode mode;
ggi_visual_t vis;
ggi_color color;
/* Set up the visual. */
err = ggiInit();
if (err)
ggiPanic( "*** startup panic, can't initialize GGI (err %d)\n", err );
vis = ggiOpen( NULL );
if (vis == NULL)
ggiPanic( "*** startup panic, can't open display\n" );
if (ggiCheckGraphMode( vis, DEF_X, DEF_Y, DEF_X, DEF_Y, DEF_DEPTH, &mode )) {
err = ggiSetMode( vis, &mode );
fputs( "*** using system-suggested graphics mode.\n", stderr );
ggiFPrintMode( stderr, &mode );
fputc( '\n', stderr );
} else {
err = ggiSetGraphMode( vis, DEF_X, DEF_Y, DEF_X, DEF_Y, DEF_DEPTH );
}
if (err)
ggiPanic( "*** startup panic, can't set graphics mode (err %d)\n", err );
err = ggi2dInit();
if (err)
ggiPanic( "*** startup panic, can't initialize GGI2D (err %d)\n", err );
err = ggi2dOpen( vis );
if (err)
ggiPanic( "*** startup panic, can't open GGI2D visual (err %d)\n", err );
/* Fill the visual with white. */
color.r = color.g = color.b = 0xFFFF;
ggiSetGCBackground( vis, ggiMapColor( vis, &color ) );
ggiSetGCForeground( vis, ggiMapColor( vis, &color ) );
ggiFillscreen( vis );
/* Draw the polygon in black. */
ggiSetGCForeground( vis, (ggi_pixel) 0 );
ggi2dFillPoly( vis, diamond, 4 );
ggiFlush( vis );
/* Wait for a keypress, then die. */
ggiGetc( vis );
ggi2dClose( vis );
ggiClose( vis );
ggi2dExit();
ggiExit();
return( 0 );
}
It compiles fine with "gcc -Wall -pedantic -g -O -o 2dtest
2dtest.c -lggi -lggi2d". Here's the output with GGI_DEBUG=255 on....
(It starts up, draws the screen fine, and then spews a whole lot
of do_blits while it idles for a couple seconds...)
LibGGI: GGI_X_flush(0x804c480, 0) called
LibGGI: _ggi_x_do_blit(0x804dce8, 0x0, 640x480) called
LibGGI: GGI_X_flush(0x804c480, 0) called
LibGGI: _ggi_x_do_blit(0x804dce8, 0x0, 640x480) called
(Here's where I press any key to kill it.)
LibGII: _giiPollAll(0x804e138, 0xa0, 0xbffffa04) called
LibGII: GII_xwin_eventpoll(0x804e138) called
LibGII: GII_xwin_eventpoll: KeyPress
LibGII: _giiEvQueueAdd(0x804e138, 0xbffff750) called
LibGII: _giiEvQueueSetup() called
LibGII: _giiEvQueueSetup alloced 0x806a848
LibGII: Adding event type 5, size 36 at pos 0
LibGII: _giiEvQueueRelease(0x804e138, 0xbffffabc, 0xa0) called
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = (nil)
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = 0x804e6d8
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = (nil)
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = (nil)
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = (nil)
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = 0x806a848
LibGII: _giiEvQueueRelease: Plausible found.
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = 0x8066828
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = (nil)
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = (nil)
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = 0x8068838
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = (nil)
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = (nil)
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = (nil)
LibGII: queue = 0x804e2b8, queue->queues = 0x804e2bc, queue->queues[queue] = (nil)
LibGII: Retrieved event type 5, size 36.
LibGGI: ggiExtensionDetach(0x804c480, 0) called
LibGGI: ggiClose("0x804c480") called
LibGGI: ggiClose: closing
LibGGI: _ggiZapDL(0x804c480, 0x804bf24) called
LibGGI: Disposing "display-x"
LibGGI: _GGI_mansync_stop() (MANSYNC_CHILD) called.
LibGGI: _GGI_X_freedbs: XShmDetach(0x804cd60, 58720263)
LibGGI: X-target closed
LibGGI: Closing handle: 0x804c848
LibGGI: _ggiZapDL(0x804c480, 0x804c67c) called
LibGGI: Disposing "generic-color"
LibGGI: Closing handle: 0x8050b90
LibGGI: _ggiZapDL(0x804c480, 0x804c6e4) called
LibGGI: Disposing "generic-linear-16"
LibGGI: Closing handle: 0x8050e20
LibGGI: Disposing "generic-stubs"
LibGGI: Closing handle: 0x8050930
LibGGI: _ggiZapDL(0x804c480, 0x804c538) called
LibGGI: Disposing "generic-stubs-2d"
LibGGI: Closing handle: 0x8065ce0
LibGGI: Disposing "helper-mansync"
LibGGI: Closing handle: 0x804de88
LibGII: giiClose(0x804e138) called
LibGII: _giiEvQueueDestroy(0x804e138) called
LibGII: Desttroying 0x804e2b8, 0x804e2bc
LibGII: _giiEvQueueDestroy going 0, (nil)
LibGII: _giiEvQueueDestroy going 1, 0x804e6d8
LibGII: _giiEvQueueDestroy going 2, (nil)
LibGII: _giiEvQueueDestroy going 3, (nil)
LibGII: _giiEvQueueDestroy going 4, (nil)
LibGII: _giiEvQueueDestroy going 5, 0x806a848
LibGII: _giiEvQueueDestroy going 6, 0x8066828
LibGII: _giiEvQueueDestroy going 7, (nil)
LibGII: _giiEvQueueDestroy going 8, (nil)
LibGII: _giiEvQueueDestroy going 9, 0x8068838
LibGII: _giiEvQueueDestroy going 10, (nil)
LibGII: _giiEvQueueDestroy going 11, (nil)
LibGII: _giiEvQueueDestroy going 12, (nil)
LibGII: _giiEvQueueDestroy going 13, (nil)
LibGII: _giiEvQueueDestroy done
Segmentation fault (core dumped)
Ouch. So I look at it in gdb, naturally.
Program received signal SIGSEGV, Segmentation fault.
0x40004122 in _dl_lookup_symbol (undef_name=0x4010937b "_XimLocalIMFree",
ref=0xbffffb00, symbol_scope=0x40009fc8, reference_name=0x804c9a0
"/usr/X11R6/lib/libX11.so.6", flags=2)
at dl-lookup.c:70
dl-lookup.c:70: No such file or directory.
(gdb) bt
#0 0x40004122 in _dl_lookup_symbol (undef_name=0x4010937b "_XimLocalIMFree",
ref=0xbffffb00, symbol_scope=0x40009fc8, reference_name=0x804c9a0
"/usr/X11R6/lib/libX11.so.6", flags=2)
at dl-lookup.c:70
#1 0x40005711 in fixup (l=0x804c9d0, reloc_offset=134531536) at
../sysdeps/i386/dl-machine.h:252
#2 0x4000584f in _dl_runtime_resolve () at dl-runtime.c:138
#3 0x4014191d in XCloseIM ()
#4 0x401a34c3 in GII_xwin_close (inp=0x804e138) at input.c:386
#5 0x400c451b in giiClose (inp=0x804e138) at gii.c:723
#6 0x40017263 in _ggiDestroyVisual (vis=0x804c480) at visual.c:280
#7 0x40013b91 in ggiClose (visual=0x804c480) at init.c:387
#8 0x8048b17 in main () at 2dtest.c:60
(gdb)
This is XF86 3.3.3 on a 2.0.36 Linux kernel, running the March
14th snapshot of GGI, which I just compiled tonight. I'm a little
boggled. Is there anything blatantly wrong about this situation, or is
this a GII bug, or an X bug, or... what? I'll poke around it more
tomorrow, but I thought I'd throw it out here in case anyone who knows
this stuff better could spot the problem.
Hope this helps...
__________________________________________________________________________
Dennis Taylor "Anyone whose days are all the same and free from
corbeau@execpc.com want inhabits eternity of a sort." - Peter Hoeg
__________________________________________________________________________
PGP Fingerprint: E8D6 9670 4FBD EEC3 6C6B 810B 2B30 E529 51BD 7B90
Index:
[thread]
[date]
[subject]
[author]