[sgen] Separate concurrent M&S object operations into start, concurrent, finish.
[mono.git] / mono / metadata / remoting.c
index 9002bf0f11e903cd63f8bdc2a8df1ca261830af0..c35a3406b899dd2b63143cec3009cb841a295a20 100644 (file)
@@ -142,6 +142,7 @@ mono_remoting_marshal_init (void)
        MonoClass *klass;
 
        static gboolean module_initialized = FALSE;
+       static gboolean icalls_registered = FALSE;
 
        if (module_initialized)
                return;
@@ -165,13 +166,21 @@ mono_remoting_marshal_init (void)
        klass = mono_class_from_name (mono_defaults.corlib, "System.Runtime.Remoting.Contexts", "Context");
        method_needs_context_sink = mono_class_get_method_from_name (klass, "get_NeedsContextSink", -1);
 
-       register_icall (type_from_handle, "type_from_handle", "object ptr", FALSE);
-       register_icall (mono_marshal_set_domain_by_id, "mono_marshal_set_domain_by_id", "int32 int32 int32", FALSE);
-       register_icall (mono_marshal_check_domain_image, "mono_marshal_check_domain_image", "int32 int32 ptr", FALSE);
-       register_icall (mono_marshal_xdomain_copy_value, "mono_marshal_xdomain_copy_value", "object object", FALSE);
-       register_icall (mono_marshal_xdomain_copy_out_value, "mono_marshal_xdomain_copy_out_value", "void object object", FALSE);
-       register_icall (mono_remoting_wrapper, "mono_remoting_wrapper", "object ptr ptr", FALSE);
-       register_icall (mono_upgrade_remote_class_wrapper, "mono_upgrade_remote_class_wrapper", "void object object", FALSE);
+       mono_loader_lock ();
+
+       if (!icalls_registered) {
+               register_icall (type_from_handle, "type_from_handle", "object ptr", FALSE);
+               register_icall (mono_marshal_set_domain_by_id, "mono_marshal_set_domain_by_id", "int32 int32 int32", FALSE);
+               register_icall (mono_marshal_check_domain_image, "mono_marshal_check_domain_image", "int32 int32 ptr", FALSE);
+               register_icall (mono_marshal_xdomain_copy_value, "mono_marshal_xdomain_copy_value", "object object", FALSE);
+               register_icall (mono_marshal_xdomain_copy_out_value, "mono_marshal_xdomain_copy_out_value", "void object object", FALSE);
+               register_icall (mono_remoting_wrapper, "mono_remoting_wrapper", "object ptr ptr", FALSE);
+               register_icall (mono_upgrade_remote_class_wrapper, "mono_upgrade_remote_class_wrapper", "void object object", FALSE);
+       }
+
+       icalls_registered = TRUE;
+
+       mono_loader_unlock ();
 
        module_initialized = TRUE;
 }
@@ -182,8 +191,6 @@ type_from_handle (MonoType *handle)
        MonoDomain *domain = mono_domain_get (); 
        MonoClass *klass = mono_class_from_mono_type (handle);
 
-       MONO_ARCH_SAVE_REGS;
-
        mono_class_init (klass);
        return mono_type_get_object (domain, handle);
 }
@@ -456,16 +463,10 @@ mono_marshal_xdomain_copy_out_value (MonoObject *src, MonoObject *dst)
                }
                return;
        }
+       default:
+               break;
        }
 
-       if (mono_object_class (src) == mono_defaults.stringbuilder_class) {
-               MonoStringBuilder *src_sb = (MonoStringBuilder *) src;
-               MonoStringBuilder *dst_sb = (MonoStringBuilder *) dst;
-       
-               MONO_OBJECT_SETREF (dst_sb, str, mono_string_new_utf16 (mono_object_domain (dst), mono_string_chars (src_sb->str), mono_string_length (src_sb->str)));
-               dst_sb->cached_str = NULL;
-               dst_sb->length = src_sb->length;
-       }
 }
 
 
@@ -1893,6 +1894,13 @@ mono_upgrade_remote_class_wrapper (MonoReflectionType *rtype, MonoTransparentPro
        mono_upgrade_remote_class (domain, (MonoObject*)tproxy, klass);
 }
 
+#else /* DISABLE_REMOTING */
+
+void
+mono_remoting_init (void)
+{
+}
+
 #endif /* DISABLE_REMOTING */
 
 /* mono_get_xdomain_marshal_type()
@@ -1927,8 +1935,9 @@ mono_get_xdomain_marshal_type (MonoType *t)
                        return MONO_MARSHAL_COPY;
                break;
        }
+       default:
+               break;
        }
-
        return MONO_MARSHAL_SERIALIZE;
 }
 
@@ -1980,15 +1989,9 @@ mono_marshal_xdomain_copy_value (MonoObject *val)
                }
                return (MonoObject *) acopy;
        }
+       default:
+               break;
        }
 
-       if (mono_object_class (val) == mono_defaults.stringbuilder_class) {
-               MonoStringBuilder *oldsb = (MonoStringBuilder *) val;
-               MonoStringBuilder *newsb = (MonoStringBuilder *) mono_object_new (domain, mono_defaults.stringbuilder_class);
-               MONO_OBJECT_SETREF (newsb, str, mono_string_new_utf16 (domain, mono_string_chars (oldsb->str), mono_string_length (oldsb->str)));
-               newsb->length = oldsb->length;
-               newsb->max_capacity = (gint32)0x7fffffff;
-               return (MonoObject *) newsb;
-       }
        return NULL;
 }