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]

Reply via email to