mirror of
https://github.com/Z3Prover/z3
synced 2025-11-25 23:19:32 +00:00
Improved Java phantom references (#7131)
* Reworked phantom reference handling. - Replaced IDecRefQueue with a new Z3ReferenceQueue class - Z3ReferenceQueue manages custom subclasses of phantom references in a doubly-linked list - Replaced all subclasses of IDecRefQueue with subclasses of Z3ReferenceQueue.Reference. These custom reference classes are embedded in the class they reference count. - Context now owns a single Z3ReferenceQueue for all types of references. * Made Statistics.Entry a static subclass * Made Context.close idempotent (as recommended) * Update CMakeLists.txt for building the Java API. * Updated CMakeLists.txt again. * Use correct SuppressWarning annotation to silence the compiler * Formatting
This commit is contained in:
parent
f7691d34fd
commit
a3d00ce356
41 changed files with 448 additions and 805 deletions
|
|
@ -17,6 +17,8 @@ Notes:
|
|||
|
||||
package com.microsoft.z3;
|
||||
|
||||
import java.lang.ref.ReferenceQueue;
|
||||
|
||||
/**
|
||||
* A function interpretation is represented as a finite map and an 'else' value.
|
||||
* Each entry in the finite map represents the value of a function given a set
|
||||
|
|
@ -93,7 +95,19 @@ public class FuncInterp<R extends Sort> extends Z3Object {
|
|||
|
||||
@Override
|
||||
void addToReferenceQueue() {
|
||||
getContext().getFuncEntryDRQ().storeReference(getContext(), this);
|
||||
getContext().getReferenceQueue().storeReference(this, FuncEntryRef::new);
|
||||
}
|
||||
|
||||
private static class FuncEntryRef extends Z3ReferenceQueue.Reference<Entry<?>> {
|
||||
|
||||
private FuncEntryRef(Entry<?> referent, ReferenceQueue<Z3Object> q) {
|
||||
super(referent, q);
|
||||
}
|
||||
|
||||
@Override
|
||||
void decRef(Context ctx, long z3Obj) {
|
||||
Native.funcEntryDecRef(ctx.nCtx(), z3Obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -186,6 +200,18 @@ public class FuncInterp<R extends Sort> extends Z3Object {
|
|||
|
||||
@Override
|
||||
void addToReferenceQueue() {
|
||||
getContext().getFuncInterpDRQ().storeReference(getContext(), this);
|
||||
getContext().getReferenceQueue().storeReference(this, FuncInterpRef::new);
|
||||
}
|
||||
|
||||
private static class FuncInterpRef extends Z3ReferenceQueue.Reference<FuncInterp<?>> {
|
||||
|
||||
private FuncInterpRef(FuncInterp<?> referent, ReferenceQueue<Z3Object> q) {
|
||||
super(referent, q);
|
||||
}
|
||||
|
||||
@Override
|
||||
void decRef(Context ctx, long z3Obj) {
|
||||
Native.funcInterpDecRef(ctx.nCtx(), z3Obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue