Skip to content

Commit 33328ec

Browse files
author
Mihail Slavchev
committed
fix issue #382
1 parent c49d2f7 commit 33328ec

3 files changed

Lines changed: 49 additions & 17 deletions

File tree

src/jni/ObjectManager.cpp

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ void ObjectManager::JSObjectWeakCallback(Isolate *isolate, ObjectWeakCallbackSta
335335
}
336336
else
337337
{
338-
m_implObjStrong.push_back(PersistentObjectIdPair(po, javaObjectID));
338+
m_implObjStrong.insert(make_pair(javaObjectID, po));
339339
jsInstanceInfo->IsJavaObjectWeak = true;
340340
}
341341
}
@@ -495,6 +495,12 @@ void ObjectManager::MarkReachableObjects(Isolate *isolate, const Local<Object>&
495495
auto jsInfo = GetJSInstanceInfo(o);
496496
if (jsInfo != nullptr)
497497
{
498+
auto hasImplObject = HasImplObject(isolate, o);
499+
if (hasImplObject)
500+
{
501+
jsInfo->IsJavaObjectWeak = false;
502+
m_implObjStrong[jsInfo->JavaObjectID] = nullptr;
503+
}
498504
o->SetHiddenValue(propName, curGCNumValue);
499505
}
500506

@@ -628,9 +634,9 @@ void ObjectManager::OnGcFinished(GCType type, GCCallbackFlags flags)
628634
auto obj = Local<Object>::New(isolate, *weakObj.po);
629635
MarkReachableObjects(isolate, obj);
630636
}
631-
for (auto strongObj : m_implObjStrong)
637+
for (const auto& kv : m_implObjStrong)
632638
{
633-
auto obj = Local<Object>::New(isolate, *strongObj.po);
639+
auto obj = Local<Object>::New(isolate, *kv.second);
634640
MarkReachableObjects(isolate, obj);
635641
}
636642

@@ -681,24 +687,27 @@ void ObjectManager::MakeRegularObjectsWeak(const set<int>& instances, DirectBuff
681687
inputBuff.Reset();
682688
}
683689

684-
void ObjectManager::MakeImplObjectsWeak(const vector<PersistentObjectIdPair>& instances, DirectBuffer& inputBuff)
690+
void ObjectManager::MakeImplObjectsWeak(const map<int, Persistent<Object>*>& instances, DirectBuffer& inputBuff)
685691
{
686692
jboolean keepAsWeak = JNI_TRUE;
687693

688-
for (const auto& poIdPair : instances)
694+
for (const auto& kv : instances)
689695
{
690-
int javaObjectId = poIdPair.javaObjectId;
696+
if (kv.second != nullptr)
697+
{
698+
int javaObjectId = kv.first;
691699

692-
bool success = inputBuff.Write(javaObjectId);
700+
bool success = inputBuff.Write(javaObjectId);
693701

694-
if (!success)
695-
{
696-
int length = inputBuff.Length();
697-
jboolean keepAsWeak = JNI_TRUE;
698-
m_env.CallStaticVoidMethod(PlatformClass, MAKE_INSTANCE_WEAK_BATCH_METHOD_ID, (jobject) inputBuff, length, keepAsWeak);
699-
inputBuff.Reset();
700-
success = inputBuff.Write(javaObjectId);
701-
assert(success);
702+
if (!success)
703+
{
704+
int length = inputBuff.Length();
705+
jboolean keepAsWeak = JNI_TRUE;
706+
m_env.CallStaticVoidMethod(PlatformClass, MAKE_INSTANCE_WEAK_BATCH_METHOD_ID, (jobject) inputBuff, length, keepAsWeak);
707+
inputBuff.Reset();
708+
success = inputBuff.Write(javaObjectId);
709+
assert(success);
710+
}
702711
}
703712
}
704713
int size = inputBuff.Size();

src/jni/ObjectManager.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ namespace tns
135135

136136
void MakeRegularObjectsWeak(const std::set<int>& instances, DirectBuffer& inputBuff);
137137

138-
void MakeImplObjectsWeak(const std::vector<PersistentObjectIdPair>& instances, DirectBuffer& inputBuff);
138+
void MakeImplObjectsWeak(const std::map<int, v8::Persistent<v8::Object>*>& instances, DirectBuffer& inputBuff);
139139

140140
void CheckWeakObjectsAreAlive(const std::vector<PersistentObjectIdPair>& instances, DirectBuffer& inputBuff, DirectBuffer& outputBuff);
141141

@@ -183,7 +183,7 @@ namespace tns
183183

184184
std::set<v8::Persistent<v8::Object>*> m_visitedPOs;
185185
std::vector<PersistentObjectIdPair> m_implObjWeak;
186-
std::vector<PersistentObjectIdPair> m_implObjStrong;
186+
std::map<int, v8::Persistent<v8::Object>*> m_implObjStrong;
187187

188188
volatile int m_currentObjectId;
189189

test-app/assets/app/tests/testGC.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,4 +241,27 @@ describe("Tests garbage collection", function () {
241241

242242
expect(o.x).toBe(123);
243243
});
244+
245+
it("should keep extended instances alive after GC", function () {
246+
var C1 = com.tns.tests.Class1.extend({});
247+
248+
function createObjects(name) {
249+
var c1 = new C1();
250+
251+
var cb1 = new com.tns.tests.Class1.Callback1(name, {
252+
getMessage: function() {
253+
var msg = c1.getMessage();
254+
return msg;
255+
}
256+
});
257+
258+
return com.tns.tests.Class1.Class2.printMessageWithDelay(cb1, 5 * 1000);
259+
}
260+
261+
expect(createObjects("Callback452356")).toBe(true);
262+
expect(createObjects("Callback417892")).toBe(true);
263+
264+
gc();
265+
java.lang.System.gc();
266+
});
244267
});

0 commit comments

Comments
 (0)