Thanks for your reply Marc,
The reference to David's interface is very helpful. It works perfectly, and I think I can get to the root of the problem with a little digging.
-Patrick
On Wed, Feb 15, 2012 at 6:38 PM, Marc Feeley feeley@iro.umontreal.cawrote:
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