MCPcopy Index your code
hub / github.com/golang/mobile / RefTracker

Class RefTracker

bind/java/Seq.java:154–248  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

152 static final RefTracker tracker = new RefTracker();
153
154 static final class RefTracker {
155 private static final int REF_OFFSET = 42;
156
157 // Next Java object reference number.
158 //
159 // Reference numbers are positive for Java objects,
160 // and start, arbitrarily at a different offset to Go
161 // to make debugging by reading Seq hex a little easier.
162 private int next = REF_OFFSET; // next Java object ref
163
164 // Java objects that have been passed to Go. refnum -> Ref
165 // The Ref obj field is non-null.
166 // This map pins Java objects so they don't get GCed while the
167 // only reference to them is held by Go code.
168 private final RefMap javaObjs = new RefMap();
169
170 // Java objects to refnum
171 private final IdentityHashMap<Object, Integer> javaRefs = new IdentityHashMap<>();
172
173 // inc increments the reference count of a Java object when it
174 // is sent to Go. inc returns the refnum for the object.
175 synchronized int inc(Object o) {
176 if (o == null) {
177 return NULL_REFNUM;
178 }
179 if (o instanceof Proxy) {
180 return ((Proxy)o).incRefnum();
181 }
182 Integer refnumObj = javaRefs.get(o);
183 if (refnumObj == null) {
184 if (next == Integer.MAX_VALUE) {
185 throw new RuntimeException("createRef overflow for " + o);
186 }
187 refnumObj = next++;
188 javaRefs.put(o, refnumObj);
189 }
190 int refnum = refnumObj;
191 Ref ref = javaObjs.get(refnum);
192 if (ref == null) {
193 ref = new Ref(refnum, o);
194 javaObjs.put(refnum, ref);
195 }
196 ref.inc();
197 return refnum;
198 }
199
200 synchronized void incRefnum(int refnum) {
201 Ref ref = javaObjs.get(refnum);
202 if (ref == null) {
203 throw new RuntimeException("referenced Java object is not found: refnum="+refnum);
204 }
205 ref.inc();
206 }
207
208 // dec decrements the reference count of a Java object when
209 // Go signals a corresponding proxy object is finalized.
210 // If the count reaches zero, the Java object is removed
211 // from the javaObjs map.

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…