Esempio n. 1
0
static void
try_free_delayed_free_items (guint32 limit)
{
	GArray *hazardous = NULL;
	DelayedFreeItem item;
	guint32 freed = 0;

	// Free all the items we can and re-add the ones we can't to the queue.
	while (mono_lock_free_array_queue_pop (&delayed_free_queue, &item)) {
		if (is_pointer_hazardous (item.p)) {
			if (!hazardous)
				hazardous = g_array_sized_new (FALSE, FALSE, sizeof (DelayedFreeItem), delayed_free_queue.num_used_entries);

			g_array_append_val (hazardous, item);
			continue;
		}

		item.free_func (item.p);
		freed++;

		if (limit && freed == limit)
			break;
	}

	if (hazardous) {
		for (gint i = 0; i < hazardous->len; i++)
			mono_lock_free_array_queue_push (&delayed_free_queue, &g_array_index (hazardous, DelayedFreeItem, i));

		g_array_free (hazardous, TRUE);
	}
}
Esempio n. 2
0
static gboolean
try_free_delayed_free_item (gboolean lock_free_context)
{
	DelayedFreeItem item;
	gboolean popped = mono_lock_free_array_queue_pop (&delayed_free_queue, &item);

	if (!popped)
		return FALSE;

	if ((lock_free_context && item.might_lock) || (is_pointer_hazardous (item.p))) {
		mono_lock_free_array_queue_push (&delayed_free_queue, &item);
		return FALSE;
	}

	item.free_func (item.p);

	return TRUE;
}