On 2012-02-15, at 9:17 PM, Patrick Li wrote:
Hi,
I am trying to get Gambit playing well with SDL, and am running into some strange problems when trying to set up the scheme environment.
This is the main() function that starts up a SDL window:
int main(int argc, char *argv[]) { /* //SETUP */ ___setup_params_struct setup_params; ___setup_params_reset (&setup_params); setup_params.version = ___VERSION; setup_params.linker = SCHEME_LIBRARY_LINKER; ___setup (&setup_params);
x = 0; run_stuff(); //Starts a simple SDL animation
/* //CLEANUP */ ___cleanup (); }
Currently everything is still in C, so there are *no* calls to any scheme functions yet.
That's not necessarily the case. When ___setup() is called, your Scheme program will be run and it might contain Scheme calls (in your previous example you were calling println for instance). Usually this "execution" of your Scheme program takes care of the initializations your program requires. After ___setup() returns, but before you call ___cleanup(), you can call Scheme functions declared using c-define in your Scheme code.
I found that the animation runs for about 3 seconds before the whole program hangs. If I comment out __setup(&setup_params), then the program executes normally.
Are there some subtleties when setting up the Gambit environment that I have to watch out for? Is Gambit spawning another thread and causing some deadlock problems? I am fairly certain that SDL is single-threaded, and the whole animation runs in an infinite loop.
The Gambit runtime is also single threaded (it does not create any OS threads, except on Windows to simulate interval timers, but that's not relevant here).
The problem could be an interference between the OS resources used by SDL and those used by the Gambit runtime, in particular the Gambit runtime sets up some signal handlers, for example to implement the heartbeat interrupt. Perhaps the SDL library is doing the same?
I know that David St-Hilaire wrote an interface to SDL which is on the Gambit Dumping Grounds (the space invaders demo). Maybe you should check that out to see how he did it?
Marc