Merge pull request #241 from viniciusjarina/fix2843
[mono.git] / mono / metadata / sgen-gray.c
index 958e86e961775e1ca137fbd9113abee72b2bda56..04f81019254a650b2c96702c93184710b095c22b 100644 (file)
  * 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;
 
@@ -49,18 +53,12 @@ gray_object_alloc_queue_section (GrayQueue *queue)
        queue->first = section;
 }
 
-static void
-gray_object_free_queue_section (GrayQueueSection *section)
+void
+mono_sgen_gray_object_free_queue_section (GrayQueueSection *section)
 {
        mono_sgen_free_internal (section, INTERNAL_MEM_GRAY_QUEUE);
 }
 
-static inline gboolean
-gray_object_queue_is_empty (GrayQueue *queue)
-{
-       return queue->first == NULL;
-}
-
 /*
  * The following two functions are called in the inner loops of the
  * collector, so they need to be as fast as possible.  We have macros
@@ -68,11 +66,11 @@ gray_object_queue_is_empty (GrayQueue *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;
 
@@ -80,11 +78,11 @@ mono_sgen_gray_object_enqueue (GrayQueue *queue, char *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));
@@ -103,8 +101,8 @@ mono_sgen_gray_object_dequeue (GrayQueue *queue)
        return obj;
 }
 
-static GrayQueueSection*
-gray_object_dequeue_section (GrayQueue *queue)
+GrayQueueSection*
+mono_sgen_gray_object_dequeue_section (SgenGrayQueue *queue)
 {
        GrayQueueSection *section;
 
@@ -119,20 +117,20 @@ gray_object_dequeue_section (GrayQueue *queue)
        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)
+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));
 
        /* Free the extra sections allocated during the last collection */
@@ -144,14 +142,16 @@ gray_object_queue_init (GrayQueue *queue)
        while (section->next) {
                next = section->next;
                section->next = next->next;
-               gray_object_free_queue_section (next);
+               mono_sgen_gray_object_free_queue_section (next);
        }
 }
 
-static void
-gray_object_queue_init_with_alloc_prepare (GrayQueue *queue, 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);
+       mono_sgen_gray_object_queue_init (queue);
        queue->alloc_prepare_func = func;
        queue->alloc_prepare_data = data;
 }
+
+#endif