+/*
+ * Protocol / DTrace
+ */
+
+#ifdef ENABLE_DTRACE
+void
+sgen_client_binary_protocol_collection_requested (int generation, size_t requested_size, gboolean force)
+{
+ MONO_GC_REQUESTED (generation, requested_size, force);
+}
+
+void
+sgen_client_binary_protocol_collection_begin (int minor_gc_count, int generation)
+{
+ MONO_GC_BEGIN (generation);
+}
+
+void
+sgen_client_binary_protocol_collection_end (int minor_gc_count, int generation, long long num_objects_scanned, long long num_unique_objects_scanned)
+{
+ MONO_GC_END (generation);
+}
+
+void
+sgen_client_binary_protocol_concurrent_start (void)
+{
+ MONO_GC_CONCURRENT_START_BEGIN (GENERATION_OLD);
+}
+
+void
+sgen_client_binary_protocol_concurrent_update (void)
+{
+ MONO_GC_CONCURRENT_UPDATE_FINISH_BEGIN (GENERATION_OLD, sgen_get_major_collector ()->get_and_reset_num_major_objects_marked ());
+}
+
+void
+sgen_client_binary_protocol_concurrent_finish (void)
+{
+ MONO_GC_CONCURRENT_UPDATE_FINISH_BEGIN (GENERATION_OLD, sgen_get_major_collector ()->get_and_reset_num_major_objects_marked ());
+}
+
+void
+sgen_client_binary_protocol_sweep_begin (int generation, int full_sweep)
+{
+ MONO_GC_SWEEP_BEGIN (generation, full_sweep);
+}
+
+void
+sgen_client_binary_protocol_sweep_end (int generation, int full_sweep)
+{
+ MONO_GC_SWEEP_END (generation, full_sweep);
+}
+
+void
+sgen_client_binary_protocol_world_stopping (long long timestamp)
+{
+ MONO_GC_WORLD_STOP_BEGIN ();
+}
+
+void
+sgen_client_binary_protocol_world_stopped (long long timestamp, long long total_major_cards, long long marked_major_cards, long long total_los_cards, long long marked_los_cards)
+{
+ MONO_GC_WORLD_STOP_END ();
+}
+
+void
+sgen_client_binary_protocol_world_restarting (int generation, long long timestamp, long long total_major_cards, long long marked_major_cards, long long total_los_cards, long long marked_los_cards)
+{
+ MONO_GC_WORLD_RESTART_BEGIN (generation);
+}
+
+void
+sgen_client_binary_protocol_world_restarted (int generation, long long timestamp)
+{
+ MONO_GC_WORLD_RESTART_END (generation);
+}
+
+static void
+protocol_alloc (gpointer obj, gpointer vtable, size_t size, gboolean pinned)
+{
+ const char *namespace = sgen_client_vtable_get_namespace (vtable);
+ const char *name = sgen_client_vtable_get_name (vtable);
+
+ if (sgen_ptr_in_nursery (obj)) {
+ if (G_UNLIKELY (MONO_GC_NURSERY_OBJ_ALLOC_ENABLED ()))
+ MONO_GC_NURSERY_OBJ_ALLOC ((mword)obj, size, namespace, name);
+ } else {
+ if (size > SGEN_MAX_SMALL_OBJ_SIZE) {
+ if (G_UNLIKELY (MONO_GC_MAJOR_OBJ_ALLOC_LARGE_ENABLED ()))
+ MONO_GC_MAJOR_OBJ_ALLOC_LARGE ((mword)obj, size, namespace, name);
+ } else if (pinned) {
+ MONO_GC_MAJOR_OBJ_ALLOC_PINNED ((mword)obj, size, namespace, name);
+ }
+ }
+}
+
+void
+sgen_client_binary_protocol_alloc (gpointer obj, gpointer vtable, size_t size)
+{
+ protocol_alloc (obj, vtable, size, FALSE);
+}
+
+void
+sgen_client_binary_protocol_alloc_pinned (gpointer obj, gpointer vtable, size_t size)
+{
+ protocol_alloc (obj, vtable, size, TRUE);
+}
+
+void
+sgen_client_binary_protocol_alloc_degraded (gpointer obj, gpointer vtable, size_t size)
+{
+ MONO_GC_MAJOR_OBJ_ALLOC_DEGRADED ((mword)obj, size, sgen_client_vtable_get_namespace (vtable), sgen_client_vtable_get_name (vtable));
+}
+
+void
+sgen_client_binary_protocol_pin (gpointer obj, gpointer vtable, size_t size)
+{
+#ifdef ENABLE_DTRACE
+ if (G_UNLIKELY (MONO_GC_OBJ_PINNED_ENABLED ())) {
+ int gen = sgen_ptr_in_nursery (obj) ? GENERATION_NURSERY : GENERATION_OLD;
+ MONO_GC_OBJ_PINNED ((mword)obj,
+ sgen_safe_object_get_size (obj),
+ sgen_client_vtable_get_namespace (vtable), sgen_client_vtable_get_name (vtable), gen);
+ }
+#endif
+}
+
+void
+sgen_client_binary_protocol_cement (gpointer ptr, gpointer vtable, size_t size)
+{
+#ifdef ENABLE_DTRACE
+ if (G_UNLIKELY (MONO_GC_OBJ_CEMENTED_ENABLED())) {
+ MONO_GC_OBJ_CEMENTED ((mword)ptr, sgen_safe_object_get_size ((GCObject*)ptr),
+ sgen_client_vtable_get_namespace (vtable), sgen_client_vtable_get_name (vtable));
+ }
+#endif
+}
+
+void
+sgen_client_binary_protocol_copy (gpointer from, gpointer to, gpointer vtable, size_t size)
+{
+#ifdef ENABLE_DTRACE
+ if (G_UNLIKELY (MONO_GC_OBJ_MOVED_ENABLED ())) {
+ int dest_gen = sgen_ptr_in_nursery (to) ? GENERATION_NURSERY : GENERATION_OLD;
+ int src_gen = sgen_ptr_in_nursery (from) ? GENERATION_NURSERY : GENERATION_OLD;
+ MONO_GC_OBJ_MOVED ((mword)to, (mword)from, dest_gen, src_gen, size, sgen_client_vtable_get_namespace (vtable), sgen_client_vtable_get_name (vtable));
+ }
+#endif
+}
+
+void
+sgen_client_binary_protocol_global_remset (gpointer ptr, gpointer value, gpointer value_vtable)
+{
+#ifdef ENABLE_DTRACE
+ if (G_UNLIKELY (MONO_GC_GLOBAL_REMSET_ADD_ENABLED ())) {
+ MONO_GC_GLOBAL_REMSET_ADD ((mword)ptr, (mword)value, sgen_safe_object_get_size (value),
+ sgen_client_vtable_get_namespace (value_vtable), sgen_client_vtable_get_name (value_vtable));
+ }
+#endif
+}
+
+void
+sgen_client_binary_protocol_dislink_update (gpointer link, gpointer obj, gboolean track, gboolean staged)
+{
+#ifdef ENABLE_DTRACE
+ if (MONO_GC_WEAK_UPDATE_ENABLED ()) {
+ GCVTable *vt = obj ? (GCVTable*)SGEN_LOAD_VTABLE (obj) : NULL;
+ MONO_GC_WEAK_UPDATE ((mword)link,
+ (mword)obj,
+ obj ? (mword)sgen_safe_object_get_size (obj) : (mword)0,
+ obj ? sgen_client_vtable_get_namespace (vt) : NULL,
+ obj ? sgen_client_vtable_get_name (vt) : NULL,
+ track ? 1 : 0);
+ }
+#endif
+}
+
+void
+sgen_client_binary_protocol_empty (gpointer start, size_t size)
+{
+ if (sgen_ptr_in_nursery (start))
+ MONO_GC_NURSERY_SWEPT ((mword)start, size);
+ else
+ MONO_GC_MAJOR_SWEPT ((mword)start, size);
+}
+#endif
+