When passing a refnum across the language barrier there is a small window where a proxy object itself can be garbage collected, its reference count go to 0 and the object be gone when the refnum is dereferenced on the other side. In Go the proxy object is pinned with runtime.KeepAlive. This CL implements the same mechanism in Java by passing the proxy object to native code, ensuring the Java GC can't reclaim it during the call. Change-Id: I23824439012eb00f90d729f59d4846999f24f01f Reviewed-on: https://go-review.googlesource.com/107095 Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
108 lines
3.0 KiB
Plaintext
108 lines
3.0 KiB
Plaintext
// Java class issue10788.TestStruct is a proxy for talking to a Go program.
|
|
// gobind -lang=java issue10788
|
|
//
|
|
// File is generated by gobind. Do not edit.
|
|
package issue10788;
|
|
|
|
import go.Seq;
|
|
|
|
public final class TestStruct implements Seq.Proxy {
|
|
static { Issue10788.touch(); }
|
|
|
|
private final int refnum;
|
|
|
|
@Override public final int incRefnum() {
|
|
Seq.incGoRef(refnum, this);
|
|
return refnum;
|
|
}
|
|
|
|
TestStruct(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
|
|
|
|
public TestStruct() { this.refnum = __New(); Seq.trackGoRef(refnum, this); }
|
|
|
|
private static native int __New();
|
|
|
|
public final native String getValue();
|
|
public final native void setValue(String v);
|
|
|
|
@Override public boolean equals(Object o) {
|
|
if (o == null || !(o instanceof TestStruct)) {
|
|
return false;
|
|
}
|
|
TestStruct that = (TestStruct)o;
|
|
String thisValue = getValue();
|
|
String thatValue = that.getValue();
|
|
if (thisValue == null) {
|
|
if (thatValue != null) {
|
|
return false;
|
|
}
|
|
} else if (!thisValue.equals(thatValue)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@Override public int hashCode() {
|
|
return java.util.Arrays.hashCode(new Object[] {getValue()});
|
|
}
|
|
|
|
@Override public String toString() {
|
|
StringBuilder b = new StringBuilder();
|
|
b.append("TestStruct").append("{");
|
|
b.append("Value:").append(getValue()).append(",");
|
|
return b.append("}").toString();
|
|
}
|
|
}
|
|
|
|
// Java class issue10788.TestInterface is a proxy for talking to a Go program.
|
|
// gobind -lang=java issue10788
|
|
//
|
|
// File is generated by gobind. Do not edit.
|
|
package issue10788;
|
|
|
|
import go.Seq;
|
|
|
|
public interface TestInterface {
|
|
public void doSomeWork(TestStruct s);
|
|
public void multipleUnnamedParams(long p0, String p1, long p2);
|
|
|
|
}
|
|
|
|
// Java class issue10788.Issue10788 is a proxy for talking to a Go program.
|
|
// gobind -lang=java issue10788
|
|
//
|
|
// File is generated by gobind. Do not edit.
|
|
package issue10788;
|
|
|
|
import go.Seq;
|
|
|
|
public abstract class Issue10788 {
|
|
static {
|
|
Seq.touch(); // for loading the native library
|
|
_init();
|
|
}
|
|
|
|
private Issue10788() {} // uninstantiable
|
|
|
|
// touch is called from other bound packages to initialize this package
|
|
public static void touch() {}
|
|
|
|
private static native void _init();
|
|
|
|
private static final class proxyTestInterface implements Seq.Proxy, TestInterface {
|
|
private final int refnum;
|
|
|
|
@Override public final int incRefnum() {
|
|
Seq.incGoRef(refnum, this);
|
|
return refnum;
|
|
}
|
|
|
|
proxyTestInterface(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
|
|
|
|
public native void doSomeWork(TestStruct s);
|
|
public native void multipleUnnamedParams(long p0, String p1, long p2);
|
|
}
|
|
|
|
|
|
}
|