+static gboolean
+event_req_matches_assembly (EventRequest *req, MonoAssembly *assembly)
+{
+ if (req->event_kind == EVENT_KIND_BREAKPOINT)
+ return breakpoint_matches_assembly (req->info, assembly);
+ else {
+ int i, j;
+
+ for (i = 0; i < req->nmodifiers; ++i) {
+ Modifier *m = &req->modifiers [i];
+
+ if (m->kind == MOD_KIND_EXCEPTION_ONLY && m->data.exc_class && m->data.exc_class->image->assembly == assembly)
+ return TRUE;
+ if (m->kind == MOD_KIND_ASSEMBLY_ONLY && m->data.assemblies) {
+ for (j = 0; m->data.assemblies [j]; ++j)
+ if (m->data.assemblies [j] == assembly)
+ return TRUE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+/*
+ * clear_event_requests_for_assembly:
+ *
+ * Clear all events requests which reference ASSEMBLY.
+ */
+static void
+clear_event_requests_for_assembly (MonoAssembly *assembly)
+{
+ int i;
+ gboolean found;
+
+ mono_loader_lock ();
+ found = TRUE;
+ while (found) {
+ found = FALSE;
+ for (i = 0; i < event_requests->len; ++i) {
+ EventRequest *req = g_ptr_array_index (event_requests, i);
+
+ if (event_req_matches_assembly (req, assembly)) {
+ clear_event_request (req->id, req->event_kind);
+ found = TRUE;
+ break;
+ }
+ }
+ }
+ mono_loader_unlock ();
+}
+
+/*
+ * type_comes_from_assembly:
+ *
+ * GHRFunc that returns TRUE if klass comes from assembly
+ */
+static gboolean
+type_comes_from_assembly (gpointer klass, gpointer also_klass, gpointer assembly)
+{
+ return (mono_class_get_image ((MonoClass*)klass) == mono_assembly_get_image ((MonoAssembly*)assembly));
+}
+
+/*
+ * clear_types_for_assembly:
+ *
+ * Clears types from loaded_classes for a given assembly
+ */
+static void
+clear_types_for_assembly (MonoAssembly *assembly)
+{
+ mono_loader_lock ();
+ g_hash_table_foreach_remove (loaded_classes, type_comes_from_assembly, assembly);
+ mono_loader_unlock ();
+}
+