Tim Lambert wrote:
>
> I'm writing a plugin in a mixture of Scheme and C. The problem I'm
> having is that when I call the Scheme code from C (using
> gimp_run_procedure2 after registering the script with
> script-fu-register), gimp_run_procedure2 returns immediately and the
> script runs in another thread.
>
> I'd like to wait until the script finishes before doing anything
> else. Gimp doesn't seem to be thread safe, so about half the time the
> plugin will crash or show the wrong data. Even if gimp was thread
> safe I would still want to wait, but the result would be confusing
> rather than catastrophic.
>
I don't think there is a good way to do this, but there is a hack that should
work. You can use a parasite as a mutex lock because calls to the parasite
functions are atomic.
C code should look something like this:
gimp_image_parasite_detach(imageID, "myplugin-mutexlock"); /* in case it is
left over from a previous call */
gimp_run_procedure2(....);
while (!(p = gimp_image_parasite_find(imageID, "myplugin-mutexlock"))
usleep(500);
gimp_parasite_free(p);
gimp_image_parasite_detach(imageID, "myplugin-mutexlock"); /* clean up parasite
*/
<rest of plugin goes here>
In your scheme function you will want to add a parasite to the image with the
name "myplugin-mutexlock" as the last statement in the script.
Of course if your script-fu bombs out your plugin will never return.
Hope This helps,
Jay Cox
[EMAIL PROTECTED]