This works,

pthread_mutex_t gp_gc_lock = PTHREAD_MUTEX_INITIALIZER;
void gp_no_gc()
{
  printf("lock\n");
  pthread_mutex_lock(&gp_gc_lock);
  gp_gc_p ++;
  pthread_mutex_unlock(&gp_gc_lock);
  printf("unlock\n");
}

void gp_do_gc()
{
  printf("lock\n");
  pthread_mutex_lock(&gp_gc_lock);
  gp_gc_p --;
  pthread_mutex_unlock(&gp_gc_lock);
  printf("unlock\n");
}

void *gp_after_mark_hook(void *hook_data, void *fn_data, void *data)
{
  SCM pt = scm_fluid_ref(gp_stacks);

  printf("lock\n");
  pthread_mutex_lock(&gp_gc_lock);
  if(gp_gc_p)
    {
      pthread_mutex_unlock(&gp_gc_lock);
      printf("unlock\n");
      return (void *)0;
    }
  pthread_mutex_unlock(&gp_gc_lock);
  printf("unlock\n");

...

But replacing the pthread versions with guile versions of the mutex result in the mutex getting into a locked state without leaving. I sthis a known issue?

/Stefan