in src/main/java/org/apache/sling/commons/threads/impl/ThreadLocalCleaner.java [168:214]
private void diff(Field field, Reference<?>[] backup) {
try {
Thread thread = Thread.currentThread();
Object threadLocals = field.get(thread);
if (threadLocals == null) {
if (backup != null) {
for (Reference<?> reference : backup) {
changed(thread, reference, Mode.REMOVED);
}
}
return;
}
Reference<?>[] current = (Reference<?>[]) tableField.get(threadLocals);
if (backup == null) {
for (Reference<?> reference : current) {
changed(thread, reference, Mode.ADDED);
}
} else {
// nested loop - both arrays *should* be relatively small
next: for (Reference<?> curRef : current) {
if (curRef != null) {
if (curRef.get() == this.threadLocalsCopy ||
curRef.get() == this.inheritableThreadLocalsCopy) {
continue next;
}
for (Reference<?> backupRef : backup) {
if (curRef == backupRef)
continue next;
}
// could not find it in backup - added
changed(thread, curRef, Mode.ADDED);
}
}
next: for (Reference<?> backupRef : backup) {
for (Reference<?> curRef : current) {
if (curRef == backupRef)
continue next;
}
// could not find it in current - removed
changed(thread, backupRef, Mode.REMOVED);
}
}
} catch (IllegalAccessException e) {
throw new IllegalStateException("Access denied", e);
}
}