18package com.microsoft.z3;
20import java.lang.ref.PhantomReference;
21import java.lang.ref.ReferenceQueue;
39class Z3ReferenceQueue {
40 private final Context ctx;
41 private final ReferenceQueue<Z3Object> referenceQueue =
new ReferenceQueue<>();
42 private final Reference<?> referenceList = emptyList();
44 Z3ReferenceQueue(Context ctx) {
51 <T extends Z3Object>
void storeReference(T z3Object, ReferenceConstructor<T> refConstructor) {
52 referenceList.insert(refConstructor.construct(z3Object, referenceQueue));
59 private void clear() {
61 while ((ref = (Reference<?>)referenceQueue.poll()) !=
null) {
70 @SuppressWarnings(
"StatementWithEmptyBody")
71 public
void forceClear() {
73 Reference<?> cur = referenceList.next;
74 while (cur.next !=
null) {
75 cur.decRef(ctx, cur.nativePtr);
80 referenceList.next = cur;
81 cur.prev = referenceList;
85 while (referenceQueue.poll() !=
null) {}
88 private static Reference<?> emptyList() {
89 Reference<?> head =
new DummyReference();
90 Reference<?> tail =
new DummyReference();
99 interface ReferenceConstructor<T
extends Z3Object> {
100 Reference<T> construct(T reference, ReferenceQueue<Z3Object> queue);
103 abstract static class Reference<T
extends Z3Object> extends
PhantomReference<T> {
105 private Reference<?> prev;
106 private Reference<?> next;
107 private final long nativePtr;
109 Reference(T referent, ReferenceQueue<Z3Object> q) {
111 this.nativePtr = referent !=
null ? referent.getNativeObject() : 0;
114 private void cleanup(Context ctx) {
115 decRef(ctx, nativePtr);
116 assert (prev !=
null && next !=
null);
121 private void insert(Reference<?> ref) {
124 ref.next = this.next;
129 abstract void decRef(Context ctx,
long z3Obj);
132 private static class DummyReference
extends Reference<Z3Object> {
134 public DummyReference() {
139 void decRef(Context ctx,
long z3Obj) {