sgen_client_pinning_end ();
remset.start_scan_remsets ();
+ TV_GETTIME (btv);
- enqueue_scan_remembered_set_jobs (&gc_thread_gray_queue, is_parallel ? NULL : object_ops_nopar, is_parallel);
+ SGEN_LOG (2, "Minor scan copy/clear remsets: %lld usecs", (long long)(TV_ELAPSED (atv, btv) / 10));
- /* we don't have complete write barrier yet, so we scan all the old generation sections */
+ TV_GETTIME (atv);
+ enqueue_scan_remembered_set_jobs (&gc_thread_gray_queue, is_parallel ? NULL : object_ops_nopar, is_parallel);
TV_GETTIME (btv);
- time_minor_scan_remsets += TV_ELAPSED (atv, btv);
- SGEN_LOG (2, "Old generation scan: %lld usecs", (long long)(TV_ELAPSED (atv, btv) / 10));
+
+ if (!is_parallel) {
+ time_minor_scan_remsets += TV_ELAPSED (atv, btv);
+ SGEN_LOG (2, "Minor scan remsets: %lld usecs", (long long)(TV_ELAPSED (atv, btv)/10));
+ }
sgen_pin_stats_report ();
sgen_gchandle_stats_report ();
}
TV_GETTIME (btv);
- time_minor_scan_roots += TV_ELAPSED (atv, btv);
+ if (!is_parallel) {
+ time_minor_scan_roots += TV_ELAPSED (atv, btv);
+
+ SGEN_LOG (2, "Minor scan roots: %lld usecs",
+ (long long)(TV_ELAPSED (atv, btv) / 10));
+ } else {
+ SGEN_LOG (2, "Minor scan remsets + roots: %lld usecs",
+ (long long)(TV_ELAPSED (atv, btv) / 10));
+
+ SGEN_LOG (2, "Minor scan remsets: accumulated major scan=%lld usecs, accumulated los scan=%lld usecs, workers=%d",
+ (long long)((time_minor_scan_major_blocks - major_scan_start) / 10),
+ (long long)((time_minor_scan_los - los_scan_start) / 10),
+ sgen_workers_get_active_worker_count (GENERATION_NURSERY));
+ }
finish_gray_stack (GENERATION_NURSERY, ctx);
return (worker_contexts [generation].active_workers_num > 1) ? worker_contexts [generation].active_workers_num * 4 : 1;
}
+int
+sgen_workers_get_active_worker_count (int generation)
+{
+ return (worker_contexts [generation].active_workers_num);
+}
+
void
sgen_workers_foreach (int generation, SgenWorkerCallback callback)
{
return 1;
}
+int
+sgen_workers_get_active_worker_count (int generation)
+{
+ return 0;
+}
+
gboolean
sgen_workers_have_idle_work (int generation)
{
void sgen_workers_take_from_queue (int generation, SgenGrayQueue *queue);
SgenObjectOperations* sgen_workers_get_idle_func_object_ops (WorkerData *worker);
int sgen_workers_get_job_split_count (int generation);
+int sgen_workers_get_active_worker_count (int generation);
void sgen_workers_foreach (int generation, SgenWorkerCallback callback);
gboolean sgen_workers_is_worker_thread (MonoNativeThreadId id);