Skip to content

Commit f2f6a87

Browse files
authored
Merge pull request #1105 from Unity-Technologies/unity-master-exception-domain-unload
Ability to continue domain unload when an exception is encountered
2 parents 9f4d362 + 2a5c864 commit f2f6a87

File tree

4 files changed

+25
-9
lines changed

4 files changed

+25
-9
lines changed

mono/metadata/appdomain.c

+15-8
Original file line numberDiff line numberDiff line change
@@ -2277,7 +2277,7 @@ ves_icall_System_AppDomain_InternalUnload (gint32 domain_id, MonoError *error)
22772277
return;
22782278

22792279
MonoException *exc = NULL;
2280-
mono_domain_try_unload (domain, (MonoObject**)&exc);
2280+
mono_domain_try_unload (domain, (MonoObject**)&exc, NULL);
22812281
if (exc)
22822282
mono_error_set_exception_instance (error, exc);
22832283
}
@@ -2643,7 +2643,7 @@ void
26432643
mono_domain_unload (MonoDomain *domain)
26442644
{
26452645
MonoObject *exc = NULL;
2646-
mono_domain_try_unload (domain, &exc);
2646+
mono_domain_try_unload (domain, &exc, NULL);
26472647
}
26482648

26492649
static MonoThreadInfoWaitRet
@@ -2659,9 +2659,12 @@ guarded_wait (MonoThreadHandle *thread_handle, guint32 timeout, gboolean alertab
26592659
}
26602660

26612661
/**
2662-
* mono_domain_unload:
2662+
* mono_domain_try_unload:
26632663
* \param domain The domain to unload
26642664
* \param exc Exception information
2665+
* \param callback Passes exception information back to caller before domain is unloaded
2666+
*
2667+
* NOTE: If the callback param is not null the domain unload will continue after executing the callback.
26652668
*
26662669
* Unloads an appdomain. Follows the process outlined in:
26672670
* http://blogs.gotdotnet.com/cbrumme
@@ -2678,7 +2681,7 @@ guarded_wait (MonoThreadHandle *thread_handle, guint32 timeout, gboolean alertab
26782681
* process could end up trying to abort the current thread.
26792682
*/
26802683
void
2681-
mono_domain_try_unload (MonoDomain *domain, MonoObject **exc)
2684+
mono_domain_try_unload (MonoDomain *domain, MonoObject **exc, MonoUnityExceptionFunc callback)
26822685
{
26832686
MonoError error;
26842687
MonoThreadHandle *thread_handle;
@@ -2724,10 +2727,14 @@ mono_domain_try_unload (MonoDomain *domain, MonoObject **exc)
27242727
}
27252728

27262729
if (*exc) {
2727-
/* Roll back the state change */
2728-
domain->state = MONO_APPDOMAIN_CREATED;
2729-
mono_domain_set (caller_domain, FALSE);
2730-
return;
2730+
if (callback != NULL)
2731+
callback (*exc);
2732+
else {
2733+
/* Roll back the state change */
2734+
domain->state = MONO_APPDOMAIN_CREATED;
2735+
mono_domain_set (caller_domain, FALSE);
2736+
return;
2737+
}
27312738
}
27322739
mono_domain_set (caller_domain, FALSE);
27332740

mono/metadata/appdomain.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ typedef struct _MonoJitInfo MonoJitInfo;
2727

2828
typedef void (*MonoDomainFunc) (MonoDomain *domain, void* user_data);
2929
typedef void (*MonoDomainAssemblyFunc) (MonoAssembly *assembly, void* user_data);
30+
typedef void (*MonoUnityExceptionFunc) (MonoObject* exc);
3031

3132
MONO_API MonoDomain*
3233
mono_init (const char *filename);
@@ -100,7 +101,7 @@ MONO_API void
100101
mono_domain_unload (MonoDomain *domain);
101102

102103
MONO_API void
103-
mono_domain_try_unload (MonoDomain *domain, MonoObject **exc);
104+
mono_domain_try_unload (MonoDomain *domain, MonoObject **exc, MonoUnityExceptionFunc callback);
104105

105106
MONO_API mono_bool
106107
mono_domain_is_unloading (MonoDomain *domain);

mono/metadata/unity-utils.c

+7
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,13 @@ void mono_unity_domain_install_capture_context_method(MonoDomain* domain, gpoint
736736
domain->capture_context_method = callback;
737737
}
738738

739+
740+
void mono_unity_domain_unload (MonoDomain* domain, MonoUnityExceptionFunc callback)
741+
{
742+
MonoObject *exc = NULL;
743+
mono_domain_try_unload (domain, &exc, callback);
744+
}
745+
739746
//array
740747

741748
int mono_unity_array_get_element_size(MonoArray *arr)

mono/metadata/unity-utils.h

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ guint32 mono_unity_method_get_token(MonoMethod *method);
102102
void mono_unity_domain_install_finalize_runtime_invoke(MonoDomain* domain, RuntimeInvokeFunction callback);
103103
void mono_unity_domain_install_capture_context_runtime_invoke(MonoDomain* domain, RuntimeInvokeFunction callback);
104104
void mono_unity_domain_install_capture_context_method(MonoDomain* domain, void* callback);
105+
MONO_API void mono_unity_domain_unload (MonoDomain *domain, MonoUnityExceptionFunc callback);
105106

106107
//array
107108
int mono_unity_array_get_element_size(MonoArray *arr);

0 commit comments

Comments
 (0)