void sgen_workers_enqueue_job (JobFunc func, void *data) { int num_entries; JobQueueEntry *entry; if (!collection_needs_workers ()) { func (NULL, data); return; } g_assert (workers_state.data.gc_in_progress); entry = sgen_alloc_internal (INTERNAL_MEM_JOB_QUEUE_ENTRY); entry->func = func; entry->data = data; mono_mutex_lock (&workers_job_queue_mutex); entry->next = workers_job_queue; workers_job_queue = entry; num_entries = ++workers_job_queue_num_entries; ++workers_num_jobs_enqueued; mono_mutex_unlock (&workers_job_queue_mutex); workers_wake_up (num_entries); }
void sgen_workers_enqueue_job (JobFunc func, void *data) { int num_entries; JobQueueEntry *entry; if (!sgen_collection_is_parallel ()) { func (NULL, data); return; } entry = sgen_alloc_internal (INTERNAL_MEM_JOB_QUEUE_ENTRY); entry->func = func; entry->data = data; mono_mutex_lock (&workers_job_queue_mutex); entry->next = workers_job_queue; workers_job_queue = entry; num_entries = ++workers_job_queue_num_entries; mono_mutex_unlock (&workers_job_queue_mutex); workers_wake_up (num_entries); }
static void workers_wake_up_all (void) { workers_wake_up (workers_num); }