CLRCriticalSection gc_heap::bgc_threads_timeout_cs;
-GCEvent gc_heap::gc_lh_block_event;
-
#endif //BACKGROUND_GC
#ifdef MARK_LIST
background_saved_lowest_address,
background_saved_highest_address));
}
-
- gc_lh_block_event.Reset();
}
#endif //BACKGROUND_GC
BOOL gc_heap::create_bgc_thread_support()
{
- BOOL ret = FALSE;
uint8_t** parr;
- if (!gc_lh_block_event.CreateManualEventNoThrow(FALSE))
- {
- goto cleanup;
- }
-
//needs to have room for enough smallest objects fitting on a page
parr = new (nothrow) uint8_t*[1 + OS_PAGE_SIZE / MIN_OBJECT_SIZE];
if (!parr)
{
- goto cleanup;
+ return FALSE;
}
make_c_mark_list (parr);
- ret = TRUE;
-
-cleanup:
-
- if (!ret)
- {
- if (gc_lh_block_event.IsValid())
- {
- gc_lh_block_event.CloseEvent();
- }
- }
-
- return ret;
+ return TRUE;
}
int gc_heap::check_for_ephemeral_alloc()
// In the secodn stage, we have the Loader lock and only one thread is
// alive. Hence we do not need to kill gc thread.
background_gc_done_event.CloseEvent();
- gc_lh_block_event.CloseEvent();
bgc_start_event.CloseEvent();
bgc_threads_timeout_cs.Destroy();
bgc_thread = 0;
//block concurrent allocation for large objects
dprintf (3, ("lh state: planning"));
- if (gc_lh_block_event.IsValid())
- {
- gc_lh_block_event.Reset();
- }
for (int i = 0; i <= (max_generation + 1); i++)
{
disable_preemptive (true);
- if (gc_lh_block_event.IsValid())
- {
- gc_lh_block_event.Set();
- }
-
add_saved_spinlock_info (true, me_release, mt_bgc_loh_sweep);
leave_spin_lock (&more_space_lock_loh);
return dwRet;
}
-// Wait for background gc to finish sweeping large objects
-void gc_heap::background_gc_wait_lh (alloc_wait_reason awr)
-{
- dprintf(2, ("Waiting end of background large sweep"));
- assert (gc_lh_block_event.IsValid());
- fire_alloc_wait_event_begin (awr);
- user_thread_wait (&gc_lh_block_event, FALSE);
- fire_alloc_wait_event_end (awr);
- dprintf(2, ("Waiting end of background large sweep is done"));
-}
-
#endif //BACKGROUND_GC
PER_HEAP_ISOLATED
void fire_alloc_wait_event_end (alloc_wait_reason awr);
PER_HEAP
- void background_gc_wait_lh (alloc_wait_reason awr = awr_ignored);
- PER_HEAP
uint32_t background_gc_wait (alloc_wait_reason awr = awr_ignored, int time_out_ms = INFINITE);
PER_HEAP_ISOLATED
void start_c_gc();
PER_HEAP_ISOLATED
GCEvent ee_proceed_event;
- PER_HEAP
- GCEvent gc_lh_block_event;
-
PER_HEAP_ISOLATED
bool gc_can_use_concurrent;