Merge commit '2437c7b2e8b4ab7786847ee1ce0b59e446a70fe2'
authorAndy Wingo <wingo@pobox.com>
Thu, 28 Nov 2013 15:03:58 +0000 (16:03 +0100)
committerAndy Wingo <wingo@pobox.com>
Thu, 28 Nov 2013 15:03:58 +0000 (16:03 +0100)
Conflicts:
libguile/guardians.c

1  2 
libguile/guardians.c

@@@ -145,7 -143,10 +145,10 @@@ finalize_guarded (void *ptr, void *fina
          continue;
        }
  
 -      g = GUARDIAN_DATA (SCM_CAR (guardian_list));
 +      g = GUARDIAN_DATA (guardian);
+       scm_i_pthread_mutex_lock_block_asyncs (&g->mutex);
        if (g->live == 0)
        abort ();
  
@@@ -210,17 -212,17 +214,19 @@@ scm_i_guard (SCM guardian, SCM obj
        void *prev_data;
        SCM guardians_for_obj, finalizer_data;
  
+       scm_i_pthread_mutex_lock_block_asyncs (&g->mutex);
        g->live++;
  
 -      /* Note: GUARDIANS_FOR_OBJ is a weak list so that a guardian can be
 -       collected before the objects it guards (see `guardians.test').  */
 -      guardians_for_obj = scm_weak_car_pair (guardian, SCM_EOL);
 +      /* Note: GUARDIANS_FOR_OBJ holds weak references to guardians so
 +       that a guardian can be collected before the objects it guards
 +       (see `guardians.test').  */
 +      guardians_for_obj = scm_cons (scm_make_weak_vector (SCM_INUM1, guardian),
 +                                    SCM_EOL);
        finalizer_data = scm_cons (SCM_BOOL_F, guardians_for_obj);
  
 -      GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (obj), finalize_guarded,
 -                                    SCM2PTR (finalizer_data),
 +      GC_REGISTER_FINALIZER_NO_ORDER (SCM_UNPACK_POINTER (obj), finalize_guarded,
 +                                    SCM_UNPACK_POINTER (finalizer_data),
                                      &prev_finalizer, &prev_data);
  
        if (prev_finalizer == finalize_guarded)
             `finalize_guarded ()' has finished.  */
          SCM proxied_finalizer;
  
 -        proxied_finalizer = scm_cons (PTR2SCM (prev_finalizer),
 -                                      PTR2SCM (prev_data));
 +        proxied_finalizer = scm_cons (SCM_PACK_POINTER (prev_finalizer),
 +                                      SCM_PACK_POINTER (prev_data));
          SCM_SETCAR (finalizer_data, proxied_finalizer);
        }
+       scm_i_pthread_mutex_unlock_unblock_asyncs (&g->mutex);
      }
  }