static gboolean workers_dequeue_and_do_job (WorkerData *data) { JobQueueEntry *entry; /* * At this point the GC might not be running anymore. We * could have been woken up by a job that was then taken by * another thread, after which the collection finished, so we * first have to successfully dequeue a job before doing * anything assuming that the collection is still ongoing. */ if (!workers_job_queue_num_entries) return FALSE; mono_mutex_lock (&workers_job_queue_mutex); entry = (JobQueueEntry*)workers_job_queue; if (entry) { workers_job_queue = entry->next; --workers_job_queue_num_entries; } mono_mutex_unlock (&workers_job_queue_mutex); if (!entry) return FALSE; g_assert (sgen_collection_is_parallel ()); entry->func (data, entry->data); sgen_free_internal (entry, INTERNAL_MEM_JOB_QUEUE_ENTRY); return TRUE; }
static gboolean workers_dequeue_and_do_job (WorkerData *data) { JobQueueEntry *entry; g_assert (collection_is_parallel ()); if (!workers_job_queue_num_entries) return FALSE; pthread_mutex_lock (&workers_job_queue_mutex); entry = (JobQueueEntry*)workers_job_queue; if (entry) { workers_job_queue = entry->next; --workers_job_queue_num_entries; } pthread_mutex_unlock (&workers_job_queue_mutex); if (!entry) return FALSE; entry->func (data, entry->data); mono_sgen_free_internal (entry, INTERNAL_MEM_JOB_QUEUE_ENTRY); return TRUE; }