17
17
18
18
import java .util .HashMap ;
19
19
import java .util .Map ;
20
+ import java .util .Queue ;
21
+ import java .util .concurrent .ConcurrentLinkedQueue ;
20
22
import java .util .function .Supplier ;
21
23
22
24
import org .eclipse .serializer .persistence .binary .types .Binary ;
39
41
public class EclipseSerializerRegisteringCopier implements AutoCloseable
40
42
{
41
43
private static final Logger LOG = LoggerFactory .getLogger (EclipseSerializerRegisteringCopier .class );
42
- private final ThreadLocal <PersistenceManager <Binary >> persistenceManagers ;
44
+ private final Queue <PersistenceManager <Binary >> persistenceManagers ;
45
+ private final Supplier <PersistenceManager <Binary >> persistenceManagerSupplier ;
43
46
private final SupportedChecker supportedChecker ;
44
47
private final RegisteringWorkingCopyAndOriginal register ;
45
48
@@ -50,18 +53,38 @@ public EclipseSerializerRegisteringCopier(
50
53
{
51
54
this .supportedChecker = supportedChecker ;
52
55
this .register = register ;
53
- this .persistenceManagers = ThreadLocal .withInitial (persistenceManagerSupplier );
56
+ this .persistenceManagerSupplier = persistenceManagerSupplier ;
57
+ this .persistenceManagers = new ConcurrentLinkedQueue <>();
58
+ }
59
+
60
+ private PersistenceManager <Binary > ensurePersistenceManager ()
61
+ {
62
+ final PersistenceManager <Binary > readyToUsePersistenceManager = this .persistenceManagers .poll ();
63
+ if (readyToUsePersistenceManager == null )
64
+ {
65
+ return this .persistenceManagerSupplier .get ();
66
+ }
67
+ return readyToUsePersistenceManager ;
68
+ }
69
+
70
+ private void returnPersistenceManagerForFutureUses (final PersistenceManager <Binary > usedPersistenceManager )
71
+ {
72
+ this .persistenceManagers .add (usedPersistenceManager );
54
73
}
55
-
56
74
57
75
@ Override
58
76
public void close ()
59
77
{
60
- this .persistenceManagers .get ().objectRegistry ().clearAll ();
61
- this .persistenceManagers .get ().close ();
62
- this .persistenceManagers .remove ();
78
+ PersistenceManager <Binary > usedPersistenceManager = this .persistenceManagers .poll ();
79
+ do
80
+ {
81
+ usedPersistenceManager .objectRegistry ().clearAll ();
82
+ usedPersistenceManager .close ();
83
+ usedPersistenceManager = this .persistenceManagers .poll ();
84
+ }
85
+ while (usedPersistenceManager != null );
63
86
}
64
-
87
+
65
88
/**
66
89
* Here lies a lot of knowledge about EclipseStore internals.
67
90
* <p>
@@ -78,7 +101,19 @@ public void close()
78
101
*/
79
102
public <T > T copy (final T source )
80
103
{
81
- final PersistenceManager <Binary > persistenceManager = this .persistenceManagers .get ();
104
+ final PersistenceManager <Binary > persistenceManager = this .ensurePersistenceManager ();
105
+ try
106
+ {
107
+ return this .copy (source , persistenceManager );
108
+ }
109
+ finally
110
+ {
111
+ this .returnPersistenceManagerForFutureUses (persistenceManager );
112
+ }
113
+ }
114
+
115
+ private <T > T copy (final T source , final PersistenceManager <Binary > persistenceManager )
116
+ {
82
117
persistenceManager .objectRegistry ().truncateAll ();
83
118
final BinaryStorer .Default storer = (BinaryStorer .Default )persistenceManager .createStorer ();
84
119
// Loader erstellen
0 commit comments