-#define FILL_MINOR_COLLECTOR_SCAN_OBJECT(collector) do { \
- (collector)->serial_ops.scan_object = SERIAL_SCAN_OBJECT; \
- (collector)->serial_ops.scan_vtype = SERIAL_SCAN_VTYPE; \
+static void
+SERIAL_SCAN_PTR_FIELD (GCObject *full_object, GCObject **ptr, SgenGrayQueue *queue)
+{
+ HANDLE_PTR (ptr, NULL);
+}
+
+static gboolean
+SERIAL_DRAIN_GRAY_STACK (SgenGrayQueue *queue)
+{
+#ifdef SGEN_SIMPLE_PAR_NURSERY
+ int i;
+ /*
+ * We do bounded iteration so we can switch to optimized context
+ * when we are the last worker remaining.
+ */
+ for (i = 0; i < 32; i++) {
+#else
+ for (;;) {
+#endif
+ GCObject *obj;
+ SgenDescriptor desc;
+
+#ifdef SGEN_SIMPLE_PAR_NURSERY
+ GRAY_OBJECT_DEQUEUE_PARALLEL (queue, &obj, &desc);
+#else
+ GRAY_OBJECT_DEQUEUE_SERIAL (queue, &obj, &desc);
+#endif
+ if (!obj)
+ return TRUE;
+
+ SERIAL_SCAN_OBJECT (obj, desc, queue);
+ }
+
+ return FALSE;
+}
+
+#define FILL_MINOR_COLLECTOR_SCAN_OBJECT(ops) do { \
+ (ops)->scan_object = SERIAL_SCAN_OBJECT; \
+ (ops)->scan_vtype = SERIAL_SCAN_VTYPE; \
+ (ops)->scan_ptr_field = SERIAL_SCAN_PTR_FIELD; \
+ (ops)->drain_gray_stack = SERIAL_DRAIN_GRAY_STACK; \