Skip to content

Commit

Permalink
add better handling of Proxy lifecycle
Browse files Browse the repository at this point in the history
  • Loading branch information
joeferner committed Jun 20, 2014
1 parent af91f79 commit 3d08cdb
Show file tree
Hide file tree
Showing 9 changed files with 32 additions and 11 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -384,8 +384,8 @@ __Example__
Creates a new java Proxy for the given interface. Functions passed in will run on the v8 main thread and not a new thread.
The returned object has two methods ref() and unref() which you can use to maintain references to prevent premature
garbage collection. You must call these methods to ensure the proxy stays around.
The returned object has a method unref() which you can use to free the object for
garbage collection.
__Arguments__
Expand Down
3 changes: 3 additions & 0 deletions compile-java-code.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,6 @@ javac ${JAVAC_OPTS} *.java

cd ../src-java/node
javac ${JAVAC_OPTS} *.java

cd ../../
javah -classpath src-java -d ./src node.NodeDynamicProxyClass
Binary file modified src-java/node/NodeDynamicProxyClass.class
Binary file not shown.
14 changes: 6 additions & 8 deletions src-java/node/NodeDynamicProxyClass.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package node;

public class NodeDynamicProxyClass implements java.lang.reflect.InvocationHandler
{
import java.util.HashSet;

public class NodeDynamicProxyClass implements java.lang.reflect.InvocationHandler {
private native Object callJs(long ptr, java.lang.reflect.Method m, Object[] args) throws Throwable;
private native void unref(long ptr) throws Throwable;
public long ptr;

public NodeDynamicProxyClass(String path, long ptr) {
Expand All @@ -25,11 +27,7 @@ public Object invoke(Object proxy, java.lang.reflect.Method m, Object[] args) th
return result;
}

public void ref() {

}

public void unref() {

public void unref() throws Throwable {
unref(this.ptr);
}
}
9 changes: 9 additions & 0 deletions src/java.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,7 @@ void Java::destroyJVM(JavaVM** jvm, JNIEnv** env) {
if(result->IsNativeError()) {
return ThrowException(result);
}
dynamicProxyData->jsObject = v8::Persistent<v8::Value>::New(result);
return scope.Close(result);
}

Expand Down Expand Up @@ -989,3 +990,11 @@ JNIEXPORT jobject JNICALL Java_node_NodeDynamicProxyClass_callJs(JNIEnv *env, jo
}
return dynamicProxyData->result;
}

JNIEXPORT void JNICALL Java_node_NodeDynamicProxyClass_unref(JNIEnv *env, jobject src, jlong ptr) {
DynamicProxyData* dynamicProxyData = (DynamicProxyData*)ptr;
if(!dynamicProxyDataVerify(dynamicProxyData)) {
return;
}
dynamicProxyData->jsObject.Clear();
}
2 changes: 2 additions & 0 deletions src/javaObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ JavaObject::~JavaObject() {
jfieldID ptrField = env->GetFieldID(nodeDynamicProxyClass, "ptr", "J");
DynamicProxyData* proxyData = (DynamicProxyData*)(long)env->GetLongField(m_obj, ptrField);
if(dynamicProxyDataVerify(proxyData)) {
proxyData->markerStart = 0;
proxyData->markerEnd = 0;
delete proxyData;
}
}
Expand Down
8 changes: 8 additions & 0 deletions src/node_NodeDynamicProxyClass.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -694,7 +694,7 @@ int dynamicProxyDataVerify(DynamicProxyData* data) {
return 1;
}

printf("*** ERROR: Lost reference to the dynamic proxy. You must maintain a reference in javascript land using ref() and unref(). ***\n");
printf("*** ERROR: Lost reference to the dynamic proxy. You must maintain a reference in javascript land using ref() and unref(). (%p) ***\n", data);
return 0;
}

Expand Down
1 change: 1 addition & 0 deletions src/utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ struct DynamicProxyData {
Java* java;
std::string interfaceName;
v8::Persistent<v8::Object> functions;
v8::Persistent<v8::Value> jsObject;
std::string methodName;
jobjectArray args;
jobject result;
Expand Down

0 comments on commit 3d08cdb

Please sign in to comment.