| 62 | } |
| 63 | |
| 64 | void add(JNIEnv* jni, jobject object, jlong size, u64 trace) { |
| 65 | if (_full) { |
| 66 | return; |
| 67 | } |
| 68 | |
| 69 | jweak wobject = jni->NewWeakGlobalRef(object); |
| 70 | if (wobject == NULL) { |
| 71 | return; |
| 72 | } |
| 73 | |
| 74 | if (_lock.tryLock()) { |
| 75 | u32 start = (((uintptr_t)object >> 4) * 31 + ((uintptr_t)jni >> 4) + trace) & (MAX_REFS - 1); |
| 76 | u32 i = start; |
| 77 | do { |
| 78 | jweak w = _refs[i]; |
| 79 | if (w == NULL || collected(w)) { |
| 80 | if (w != NULL) jni->DeleteWeakGlobalRef(w); |
| 81 | _refs[i] = wobject; |
| 82 | _values[i].size = size; |
| 83 | _values[i].trace = trace; |
| 84 | _values[i].time = TSC::ticks(); |
| 85 | _lock.unlock(); |
| 86 | return; |
| 87 | } |
| 88 | } while ((i = (i + 1) & (MAX_REFS - 1)) != start); |
| 89 | |
| 90 | _full = true; |
| 91 | _lock.unlock(); |
| 92 | } |
| 93 | |
| 94 | jni->DeleteWeakGlobalRef(wobject); |
| 95 | } |
| 96 | |
| 97 | void dump(JNIEnv* jni) { |
| 98 | _lock.lock(); |
no test coverage detected