[AD] crash! set_gfx_mode(GFX_TEXT...); vs draw_mouse() |
[ Thread Index |
Date Index
| More lists.liballeg.org/allegro-developers Archives
]
fix / recommendation at bottom.
WHAT HAPPENED :
using:
msvc v6.0+sp3
win2k pro
wip 419.
crashed with the following message:
The instruction at "0xxx40f72e" ref'd mem at 0xddddddddd.
The memory could not be "read".
the debugger went to:
from allegro/inline/draw.inl
AL_INLINE(void, draw_sprite, (BITMAP *bmp, BITMAP *sprite, int x, int y);
the sprite->vtable = 0xdddddddd
the x = -4096
the y = -4096
bmp->vtable->color_depth = 16
it occured when i called
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
after being in a DirectX Window, 16bit x 800 x 600.
1/2 way down the call stack shows
tim_win32_high_perf_thread(void* 0x0000000)
i suspect it might be some type of race condition...
it does not happen everytime, only about 50% of the time.
but when it does happen, it seems to crash in the same spot.
[later]
after recompiling the wip419 staticlink debug build
and then re-compiling all my code (after deleting the .pcb files(generated
by msvc))
first run crashed out on the same spot, this time the call stack showed
draw_sprite(0x8374,0x3824, -4100 -4106)
draw_mouse(-1,-1);
mouse_move()
_handle_timer_tick(int 11934)
tim_win32_high_perf_thread(void* 0x000000);
_threadstart(...);
KERNEL32!
looks like a race condition when the screen is killed, the mouse (in
another thread) attempting to draw on the screen.
FIX:
i put remove_mouse() before the call to set_gfx_mode(GFX_TEXT) and it
seems to work.
RECOMMENDATION:
the documentation at remove_mouse() says "You don't normally need to
bother calling this, because allegro_exit() will do it for you. "
to me, this says. remove_mouse() doesn't need to be called.
But a set_gfx_mode(GFX_TEXT) before allegro_exit() will make my program
crash... well at least in win32 it does.
As this probably only occurs in the win32 version of allegro, changing the
docs seems wrong.
can remove_mouse() be called automatically by the set_gfx_mode() but
only when the driver selected is GFX_TEXT.
this will stop it from crashing, and the mouse will not be removed when
changing to other gfx_modes.
i do not see any reason why someone would want to set GFX_TEXT mode &&
leave the mouse driver still running.