示例#1
0
/* memory.                                                              */
static void disable_gc_for_dlopen(void)
{
  DCL_LOCK_STATE;
  LOCK();
  while (GC_incremental && GC_collection_in_progress()) {
    GC_collect_a_little_inner(1000);
  }
  ++GC_dont_gc;
  UNLOCK();
}
示例#2
0
void GC_wait_for_gc_completion(GC_bool wait_for_all)
{
    GC_ASSERT(I_HOLD_LOCK());
    if (GC_incremental && GC_collection_in_progress()) {
	int old_gc_no = GC_gc_no;

	/* Make sure that no part of our stack is still on the mark stack, */
	/* since it's about to be unmapped.				   */
	while (GC_incremental && GC_collection_in_progress()
	       && (wait_for_all || old_gc_no == GC_gc_no)) {
	    ENTER_GC();
	    GC_in_thread_creation = TRUE;
            GC_collect_a_little_inner(1);
	    GC_in_thread_creation = FALSE;
	    EXIT_GC();
	    UNLOCK();
	    sched_yield();
	    LOCK();
	}
    }
}