Skip to content

Commit a55a34c

Browse files
committed
JSObject异步垃圾回收部分逻辑
1 parent 48fe220 commit a55a34c

File tree

3 files changed

+59
-2
lines changed

3 files changed

+59
-2
lines changed

unity/Assets/core/upm/Runtime/Src/PInvoke/JSType/JSObject.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ internal JSObject(IntPtr apis, IntPtr valueRef)
3030
public T Get<T>(string key)
3131
{
3232
var envRef = NativeAPI.pesapi_get_ref_associated_env(apis, objRef);
33+
if (!NativeAPI.pesapi_env_ref_is_valid(apis, envRef))
34+
{
35+
throw new InvalidOperationException("associated script env has disposed!");
36+
}
3337
var scope = NativeAPI.pesapi_open_scope(apis, envRef);
3438
var env = NativeAPI.pesapi_get_env_from_ref(apis, envRef);
3539
var obj = NativeAPI.pesapi_get_value_from_ref(apis, env, objRef);
@@ -50,7 +54,26 @@ public T Get<T>(string key)
5054
lock(jsEnv)
5155
{
5256
#endif
53-
57+
UnityEngine.Debug.Log("~JSObject~JSObject~JSObject");
58+
var envRef = NativeAPI.pesapi_get_ref_associated_env(apis, objRef);
59+
if (!NativeAPI.pesapi_env_ref_is_valid(apis, envRef))
60+
{
61+
NativeAPI.pesapi_release_env_ref(apis, envRef);
62+
}
63+
else
64+
{
65+
var scope = NativeAPI.pesapi_open_scope(apis, envRef);
66+
try
67+
{
68+
var env = NativeAPI.pesapi_get_env_from_ref(apis, envRef);
69+
var envIdx = NativeAPI.pesapi_get_env_private(apis, env).ToInt32();
70+
JsEnv.jsEnvs[envIdx].addPendingKillScriptObjects(objRef);
71+
}
72+
finally
73+
{
74+
NativeAPI.pesapi_close_scope(apis, scope);
75+
}
76+
}
5477
#if THREAD_SAFE
5578
}
5679
#endif

unity/Assets/core/upm/Runtime/Src/PInvoke/JsEnv.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,40 @@ public static void LogErrorCallback(string msg)
445445
#endif
446446
}
447447

448+
List<IntPtr> pendingKillScriptObjectRefs = new List<IntPtr>();
449+
450+
internal void addPendingKillScriptObjects(IntPtr envRef)
451+
{
452+
lock (pendingKillScriptObjectRefs)
453+
{
454+
pendingKillScriptObjectRefs.Add(envRef);
455+
}
456+
}
457+
458+
internal void cleanupPendingKillScriptObjects()
459+
{
460+
lock (pendingKillScriptObjectRefs)
461+
{
462+
if (pendingKillScriptObjectRefs.Count == 0) return;
463+
var scope = apis.open_scope(envRef);
464+
try
465+
{
466+
var env = apis.get_env_from_ref(envRef);
467+
while (pendingKillScriptObjectRefs.Count > 0)
468+
{
469+
var lastIndex = pendingKillScriptObjectRefs.Count - 1;
470+
var objRef = pendingKillScriptObjectRefs[lastIndex];
471+
pendingKillScriptObjectRefs.RemoveAt(lastIndex);
472+
473+
}
474+
}
475+
finally
476+
{
477+
apis.close_scope(scope);
478+
}
479+
}
480+
}
481+
448482
~JsEnv()
449483
{
450484
#if THREAD_SAFE

unity/Assets/core/upm/Runtime/Src/PInvoke/Wrapper/ExpressionsWrap.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ public static JSObject ScriptToNative_ScriptObject(IntPtr apis, IntPtr env, IntP
311311
if (ret == null)
312312
{
313313
ret = new JSObject(apis, valueRef);
314-
weakHandle = GCHandle.ToIntPtr(GCHandle.Alloc(ret));
314+
weakHandle = GCHandle.ToIntPtr(GCHandle.Alloc(ret, GCHandleType.Weak));
315315
Marshal.StructureToPtr(weakHandle, weakHandlePtr, false);
316316
}
317317
return ret;

0 commit comments

Comments
 (0)