* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-#define GRAY_QUEUE_LENGTH_LIMIT 64
+#include "config.h"
+#ifdef HAVE_SGEN_GC
+
+#include "metadata/sgen-gc.h"
+#include "utils/mono-counters.h"
-static GrayQueue gray_queue;
+#define GRAY_QUEUE_LENGTH_LIMIT 64
-static void
-gray_object_alloc_queue_section (GrayQueue *queue)
+void
+mono_sgen_gray_object_alloc_queue_section (SgenGrayQueue *queue)
{
GrayQueueSection *section;
queue->free_list = section->next;
} else {
/* Allocate a new section */
- section = mono_sgen_alloc_internal_fixed (queue->allocator, INTERNAL_MEM_GRAY_QUEUE);
+ section = mono_sgen_alloc_internal (INTERNAL_MEM_GRAY_QUEUE);
}
section->end = 0;
queue->first = section;
}
-static void
-gray_object_free_queue_section (GrayQueueSection *section, SgenInternalAllocator *thread_allocator)
-{
- mono_sgen_free_internal_delayed (section, INTERNAL_MEM_GRAY_QUEUE, thread_allocator);
-}
-
-static inline gboolean
-gray_object_queue_is_empty (GrayQueue *queue)
+void
+mono_sgen_gray_object_free_queue_section (GrayQueueSection *section)
{
- return queue->first == NULL;
+ mono_sgen_free_internal (section, INTERNAL_MEM_GRAY_QUEUE);
}
/*
*/
void
-mono_sgen_gray_object_enqueue (GrayQueue *queue, char *obj)
+mono_sgen_gray_object_enqueue (SgenGrayQueue *queue, char *obj)
{
DEBUG (9, g_assert (obj));
if (G_UNLIKELY (!queue->first || queue->first->end == SGEN_GRAY_QUEUE_SECTION_SIZE))
- gray_object_alloc_queue_section (queue);
+ mono_sgen_gray_object_alloc_queue_section (queue);
DEBUG (9, g_assert (queue->first && queue->first->end < SGEN_GRAY_QUEUE_SECTION_SIZE));
queue->first->objects [queue->first->end++] = obj;
}
char*
-mono_sgen_gray_object_dequeue (GrayQueue *queue)
+mono_sgen_gray_object_dequeue (SgenGrayQueue *queue)
{
char *obj;
- if (gray_object_queue_is_empty (queue))
+ if (mono_sgen_gray_object_queue_is_empty (queue))
return NULL;
DEBUG (9, g_assert (queue->first->end));
return obj;
}
-static GrayQueueSection*
-gray_object_dequeue_section (GrayQueue *queue)
+GrayQueueSection*
+mono_sgen_gray_object_dequeue_section (SgenGrayQueue *queue)
{
GrayQueueSection *section;
return section;
}
-static void
-gray_object_enqueue_section (GrayQueue *queue, GrayQueueSection *section)
+void
+mono_sgen_gray_object_enqueue_section (SgenGrayQueue *queue, GrayQueueSection *section)
{
section->next = queue->first;
queue->first = section;
}
-static void
-gray_object_queue_init (GrayQueue *queue, SgenInternalAllocator *allocator)
+void
+mono_sgen_gray_object_queue_init (SgenGrayQueue *queue)
{
GrayQueueSection *section, *next;
int i;
- g_assert (gray_object_queue_is_empty (queue));
+ g_assert (mono_sgen_gray_object_queue_is_empty (queue));
DEBUG (9, g_assert (queue->balance == 0));
- queue->allocator = allocator;
-
/* Free the extra sections allocated during the last collection */
i = 0;
for (section = queue->free_list; section && i < GRAY_QUEUE_LENGTH_LIMIT - 1; section = section->next)
while (section->next) {
next = section->next;
section->next = next->next;
- gray_object_free_queue_section (next, allocator);
+ mono_sgen_gray_object_free_queue_section (next);
}
}
-static void
-gray_object_queue_init_with_alloc_prepare (GrayQueue *queue, SgenInternalAllocator *allocator, GrayQueueAllocPrepareFunc func, void *data)
+void
+mono_sgen_gray_object_queue_init_with_alloc_prepare (SgenGrayQueue *queue, GrayQueueAllocPrepareFunc func, void *data)
{
- gray_object_queue_init (queue, allocator);
+ mono_sgen_gray_object_queue_init (queue);
queue->alloc_prepare_func = func;
queue->alloc_prepare_data = data;
}
+
+#endif