Skip to content

Commit 2705b95

Browse files
Update SpringDataEclipseStoreLazy.java
1 parent acb8e9a commit 2705b95

1 file changed

Lines changed: 64 additions & 0 deletions

File tree

spring-data-eclipse-store/src/main/java/software/xdev/spring/data/eclipse/store/repository/lazy/SpringDataEclipseStoreLazy.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717

1818
import java.lang.reflect.Field;
1919
import java.util.Objects;
20+
import java.util.function.Consumer;
2021

22+
import org.eclipse.serializer.collections.HashEnum;
23+
import org.eclipse.serializer.collections.types.XGettingEnum;
2124
import org.eclipse.serializer.reference.Lazy;
2225
import org.eclipse.serializer.reference.ObjectSwizzling;
2326
import org.eclipse.serializer.reference.Swizzling;
@@ -73,6 +76,7 @@ final class Default<T> implements SpringDataEclipseStoreLazy<T>
7376
private transient ObjectSwizzling loader;
7477
private transient WorkingCopier<T> copier;
7578
private transient boolean isStored;
79+
private final transient HashEnum<Object> usageMarks = HashEnum.New();
7680

7781
private Default(final Lazy<T> lazySubject)
7882
{
@@ -259,5 +263,65 @@ public boolean isOriginalObject()
259263
{
260264
return this.objectToBeWrapped != null;
261265
}
266+
267+
// region Copied from org.eclipse.serializer.reference.UsageMarkable#Default
268+
@Override
269+
public int markUsedFor(final Object instance)
270+
{
271+
// lock internal instance to avoid side effect deadlocks
272+
synchronized(this.usageMarks)
273+
{
274+
final boolean added = this.usageMarks.add(instance);
275+
276+
return this.usageMarks.intSize() * (added ? 1 : -1);
277+
}
278+
}
279+
280+
@Override
281+
public int unmarkUsedFor(final Object instance)
282+
{
283+
// lock internal instance to avoid side effect deadlocks
284+
synchronized(this.usageMarks)
285+
{
286+
final boolean removed = this.usageMarks.removeOne(instance);
287+
288+
return this.usageMarks.intSize() * (removed ? 1 : -1);
289+
}
290+
}
291+
292+
@Override
293+
public boolean isUsed()
294+
{
295+
// lock internal instance to avoid side effect deadlocks
296+
synchronized(this.usageMarks)
297+
{
298+
return !this.usageMarks.isEmpty();
299+
}
300+
}
301+
302+
@Override
303+
public int markUnused()
304+
{
305+
// lock internal instance to avoid side effect deadlocks
306+
synchronized(this.usageMarks)
307+
{
308+
final int currentSize = this.usageMarks.intSize();
309+
this.usageMarks.clear();
310+
311+
return currentSize;
312+
}
313+
}
314+
315+
@Override
316+
public void accessUsageMarks(final Consumer<? super XGettingEnum<Object>> logic)
317+
{
318+
// lock internal instance to avoid side effect deadlocks
319+
synchronized(this.usageMarks)
320+
{
321+
// no null check to give logic a chance to notice no-marks case.
322+
logic.accept(this.usageMarks);
323+
}
324+
}
325+
// endregion
262326
}
263327
}

0 commit comments

Comments
 (0)