Android runs a finalizer watchdog that tracks the running time of finalizers and throws an exception if any runs too long. Our finalizers do very little work and as such are not affected by the timeout. However, there has been reports, for example: https://stackoverflow.com/questions/24021609/how-to-handle-java-util-concurrent-timeoutexception-android-os-binderproxy-fin that the watchdog does not take into account periods where the device goes to sleep in the middle of a finalizer run. So if a given app runs in the background, the Java GC starts a finalizer and the device goes to sleep before it returns, an exception will crash the app if the sleep period extends the watchdog timeout. The problem might be fixed on some newer version of Android, but the problem is reported for as late as Android 6. The suggested workaround is to use PhantomReferences and run a background thread that take dead references off a ReferenceQueue and perform cleanup. This CL builds on the previous CL and splits up the Ref class so Refs only reference counts Java objects, while a new class GoRef tracks Go references. The Go references are wrapped in PhantomReferences that in turn appear on a GoRefQueue to be cleaned up by a background (daemon) Thread. Change-Id: I04e3296b851999c612d3baf6a593cc044c2c5bdd Reviewed-on: https://go-review.googlesource.com/106876 Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
202 lines
5.0 KiB
Plaintext
202 lines
5.0 KiB
Plaintext
// Java class structs.S is a proxy for talking to a Go program.
|
|
// gobind -lang=java structs
|
|
//
|
|
// File is generated by gobind. Do not edit.
|
|
package structs;
|
|
|
|
import go.Seq;
|
|
|
|
public final class S implements Seq.Proxy {
|
|
static { Structs.touch(); }
|
|
|
|
private final int refnum;
|
|
|
|
@Override public final int incRefnum() {
|
|
Seq.incGoRef(refnum);
|
|
return refnum;
|
|
}
|
|
|
|
S(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
|
|
|
|
public S() { this.refnum = __New(); Seq.trackGoRef(refnum, this); }
|
|
|
|
private static native int __New();
|
|
|
|
public final native double getX();
|
|
public final native void setX(double v);
|
|
|
|
public final native double getY();
|
|
public final native void setY(double v);
|
|
|
|
public native S identity() throws Exception;
|
|
public native double sum();
|
|
@Override public boolean equals(Object o) {
|
|
if (o == null || !(o instanceof S)) {
|
|
return false;
|
|
}
|
|
S that = (S)o;
|
|
double thisX = getX();
|
|
double thatX = that.getX();
|
|
if (thisX != thatX) {
|
|
return false;
|
|
}
|
|
double thisY = getY();
|
|
double thatY = that.getY();
|
|
if (thisY != thatY) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@Override public int hashCode() {
|
|
return java.util.Arrays.hashCode(new Object[] {getX(), getY()});
|
|
}
|
|
|
|
@Override public String toString() {
|
|
StringBuilder b = new StringBuilder();
|
|
b.append("S").append("{");
|
|
b.append("X:").append(getX()).append(",");
|
|
b.append("Y:").append(getY()).append(",");
|
|
return b.append("}").toString();
|
|
}
|
|
}
|
|
|
|
// Java class structs.S2 is a proxy for talking to a Go program.
|
|
// gobind -lang=java structs
|
|
//
|
|
// File is generated by gobind. Do not edit.
|
|
package structs;
|
|
|
|
import go.Seq;
|
|
|
|
public final class S2 implements Seq.Proxy, I {
|
|
static { Structs.touch(); }
|
|
|
|
private final int refnum;
|
|
|
|
@Override public final int incRefnum() {
|
|
Seq.incGoRef(refnum);
|
|
return refnum;
|
|
}
|
|
|
|
S2(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
|
|
|
|
public S2() { this.refnum = __New(); Seq.trackGoRef(refnum, this); }
|
|
|
|
private static native int __New();
|
|
|
|
public native void m();
|
|
public native String string();
|
|
@Override public boolean equals(Object o) {
|
|
if (o == null || !(o instanceof S2)) {
|
|
return false;
|
|
}
|
|
S2 that = (S2)o;
|
|
return true;
|
|
}
|
|
|
|
@Override public int hashCode() {
|
|
return java.util.Arrays.hashCode(new Object[] {});
|
|
}
|
|
|
|
@Override public String toString() {
|
|
return string();
|
|
}
|
|
}
|
|
|
|
// Java class structs.Structs_ is a proxy for talking to a Go program.
|
|
// gobind -lang=java structs
|
|
//
|
|
// File is generated by gobind. Do not edit.
|
|
package structs;
|
|
|
|
import go.Seq;
|
|
|
|
public final class Structs_ implements Seq.Proxy, I {
|
|
static { Structs.touch(); }
|
|
|
|
private final int refnum;
|
|
|
|
@Override public final int incRefnum() {
|
|
Seq.incGoRef(refnum);
|
|
return refnum;
|
|
}
|
|
|
|
Structs_(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
|
|
|
|
public Structs_() { this.refnum = __New(); Seq.trackGoRef(refnum, this); }
|
|
|
|
private static native int __New();
|
|
|
|
public native void m();
|
|
@Override public boolean equals(Object o) {
|
|
if (o == null || !(o instanceof Structs_)) {
|
|
return false;
|
|
}
|
|
Structs_ that = (Structs_)o;
|
|
return true;
|
|
}
|
|
|
|
@Override public int hashCode() {
|
|
return java.util.Arrays.hashCode(new Object[] {});
|
|
}
|
|
|
|
@Override public String toString() {
|
|
StringBuilder b = new StringBuilder();
|
|
b.append("Structs_").append("{");
|
|
return b.append("}").toString();
|
|
}
|
|
}
|
|
|
|
// Java class structs.I is a proxy for talking to a Go program.
|
|
// gobind -lang=java structs
|
|
//
|
|
// File is generated by gobind. Do not edit.
|
|
package structs;
|
|
|
|
import go.Seq;
|
|
|
|
public interface I {
|
|
public void m();
|
|
|
|
}
|
|
|
|
// Java class structs.Structs is a proxy for talking to a Go program.
|
|
// gobind -lang=java structs
|
|
//
|
|
// File is generated by gobind. Do not edit.
|
|
package structs;
|
|
|
|
import go.Seq;
|
|
|
|
public abstract class Structs {
|
|
static {
|
|
Seq.touch(); // for loading the native library
|
|
_init();
|
|
}
|
|
|
|
private Structs() {} // 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 proxyI implements Seq.Proxy, I {
|
|
private final int refnum;
|
|
|
|
@Override public final int incRefnum() {
|
|
Seq.incGoRef(refnum);
|
|
return refnum;
|
|
}
|
|
|
|
proxyI(int refnum) { this.refnum = refnum; Seq.trackGoRef(refnum, this); }
|
|
|
|
public native void m();
|
|
}
|
|
|
|
|
|
public static native S identity(S s);
|
|
public static native S identityWithError(S s) throws Exception;
|
|
}
|