32
32
*/
33
33
package org .exist .storage .lock ;
34
34
35
- import com .evolvedbinary .j8fu .tuple .Tuple3 ;
36
35
import org .apache .logging .log4j .LogManager ;
37
36
import org .apache .logging .log4j .Logger ;
38
37
import org .exist .storage .lock .Lock .LockType ;
42
41
import org .exist .xmldb .XmldbURI ;
43
42
import uk .ac .ic .doc .slurp .multilock .MultiLock ;
44
43
45
- import java .util .Arrays ;
46
44
import java .util .concurrent .locks .ReentrantLock ;
47
45
import java .util .function .Consumer ;
48
46
@@ -219,19 +217,8 @@ public ManagedCollectionLock acquireCollectionReadLock(final XmldbURI collection
219
217
final LockGroup lockGroup = acquirePathReadLock (LockType .COLLECTION , collectionPath );
220
218
return new ManagedCollectionLock (
221
219
collectionPath ,
222
- Arrays .stream (lockGroup .locks ).map (Tuple3 ::get_1 ).toArray (MultiLock []::new ),
223
- () -> unlockAll (lockGroup .locks , l -> lockTable .released (lockGroup .groupId , l ._3 , LockType .COLLECTION , l ._2 ))
224
- );
225
- }
226
-
227
- private static class LockGroup {
228
- final long groupId ;
229
- final Tuple3 <MultiLock , Lock .LockMode , String >[] locks ;
230
-
231
- private LockGroup (final long groupId , final Tuple3 <MultiLock , Lock .LockMode , String >[] locks ) {
232
- this .groupId = groupId ;
233
- this .locks = locks ;
234
- }
220
+ lockGroup ,
221
+ lockTable );
235
222
}
236
223
237
224
/**
@@ -250,7 +237,7 @@ public LockGroup acquirePathReadLock(final LockType lockType, final XmldbURI pat
250
237
final long groupId = System .nanoTime ();
251
238
252
239
String pathStr = "" ;
253
- final Tuple3 < MultiLock , Lock . LockMode , String > [] locked = new Tuple3 [segments .length ];
240
+ final LockedPath [] locked = new LockedPath [segments .length ];
254
241
for (int i = 0 ; i < segments .length ; i ++) {
255
242
pathStr += '/' + segments [i ].toString ();
256
243
@@ -265,12 +252,12 @@ public LockGroup acquirePathReadLock(final LockType lockType, final XmldbURI pat
265
252
266
253
lockTable .attempt (groupId , pathStr , lockType , lockMode );
267
254
if (lock (lock , lockMode )) {
268
- locked [i ] = new Tuple3 <> (lock , lockMode , pathStr );
255
+ locked [i ] = new LockedPath (lock , lockMode , pathStr );
269
256
lockTable .acquired (groupId , pathStr , lockType , lockMode );
270
257
} else {
271
258
lockTable .attemptFailed (groupId , pathStr , lockType , lockMode );
272
259
273
- unlockAll (locked , l -> lockTable .released (groupId , l ._3 , lockType , l ._2 ));
260
+ unlockAll (locked , l -> lockTable .released (groupId , l .path , lockType , l .mode ));
274
261
275
262
throw new LockException ("Unable to acquire " + lockType + " " + lockMode + " for: " + pathStr );
276
263
}
@@ -287,7 +274,7 @@ public LockGroup acquirePathReadLock(final LockType lockType, final XmldbURI pat
287
274
*
288
275
* @return true, if we were able to lock with the mode.
289
276
*/
290
- private boolean lock (final MultiLock lock , final Lock .LockMode lockMode ) {
277
+ private static boolean lock (final MultiLock lock , final Lock .LockMode lockMode ) {
291
278
switch (lockMode ) {
292
279
case INTENTION_READ :
293
280
lock .intentionReadLock ();
@@ -319,10 +306,10 @@ private boolean lock(final MultiLock lock, final Lock.LockMode lockMode) {
319
306
*
320
307
* @param locked An array of locks in acquisition order
321
308
*/
322
- private void unlockAll (final Tuple3 < MultiLock , Lock . LockMode , String > [] locked , final Consumer <Tuple3 < MultiLock , Lock . LockMode , String > > unlockListener ) {
323
- for (int i = locked .length - 1 ; i >= 0 ; i --) {
324
- final Tuple3 < MultiLock , Lock . LockMode , String > lock = locked [i ];
325
- unlock (lock ._1 , lock ._2 );
309
+ static void unlockAll (final LockedPath [] locked , final Consumer <LockedPath > unlockListener ) {
310
+ for (int i = locked .length - 1 ; i >= 0 ; i --) {
311
+ final LockedPath lock = locked [i ];
312
+ unlock (lock .lock , lock .mode );
326
313
unlockListener .accept (lock );
327
314
}
328
315
}
@@ -333,8 +320,8 @@ private void unlockAll(final Tuple3<MultiLock, Lock.LockMode, String>[] locked,
333
320
* @param lock The lock object to unlock.
334
321
* @param lockMode The mode of the {@code lock} to release.
335
322
*/
336
- private void unlock (final MultiLock lock , final Lock .LockMode lockMode ) {
337
- switch (lockMode ) {
323
+ static void unlock (final MultiLock lock , final Lock .LockMode lockMode ) {
324
+ switch (lockMode ) {
338
325
case INTENTION_READ :
339
326
lock .unlockIntentionRead ();
340
327
break ;
@@ -380,9 +367,8 @@ ManagedCollectionLock acquireCollectionWriteLock(final XmldbURI collectionPath,
380
367
final LockGroup lockGroup = acquirePathWriteLock (LockType .COLLECTION , collectionPath , lockParent );
381
368
return new ManagedCollectionLock (
382
369
collectionPath ,
383
- Arrays .stream (lockGroup .locks ).map (Tuple3 ::get_1 ).toArray (MultiLock []::new ),
384
- () -> unlockAll (lockGroup .locks , l -> lockTable .released (lockGroup .groupId , l ._3 , LockType .COLLECTION , l ._2 ))
385
- );
370
+ lockGroup ,
371
+ lockTable );
386
372
}
387
373
388
374
/**
@@ -400,7 +386,7 @@ LockGroup acquirePathWriteLock(final LockType lockType, final XmldbURI path,
400
386
final long groupId = System .nanoTime ();
401
387
402
388
String pathStr = "" ;
403
- final Tuple3 < MultiLock , Lock . LockMode , String > [] locked = new Tuple3 [segments .length ];
389
+ final LockedPath [] locked = new LockedPath [segments .length ];
404
390
for (int i = 0 ; i < segments .length ; i ++) {
405
391
pathStr += '/' + segments [i ].toString ();
406
392
@@ -437,12 +423,12 @@ LockGroup acquirePathWriteLock(final LockType lockType, final XmldbURI path,
437
423
438
424
lockTable .attempt (groupId , pathStr , lockType , lockMode );
439
425
if (lock (lock , lockMode )) {
440
- locked [i ] = new Tuple3 <> (lock , lockMode , pathStr );
426
+ locked [i ] = new LockedPath (lock , lockMode , pathStr );
441
427
lockTable .acquired (groupId , pathStr , lockType , lockMode );
442
428
} else {
443
429
lockTable .attemptFailed (groupId , pathStr , lockType , lockMode );
444
430
445
- unlockAll (locked , l -> lockTable .released (groupId , l ._3 , lockType , l ._2 ));
431
+ unlockAll (locked , l -> lockTable .released (groupId , l .path , lockType , l .mode ));
446
432
447
433
throw new LockException ("Unable to acquire " + lockType + " " + lockMode + " for: " + pathStr );
448
434
}
@@ -503,11 +489,7 @@ MultiLock getDocumentLock(final String documentPath) {
503
489
public ManagedDocumentLock acquireDocumentReadLock (final XmldbURI documentPath ) throws LockException {
504
490
if (usePathLocksForDocuments ) {
505
491
final LockGroup lockGroup = acquirePathReadLock (LockType .DOCUMENT , documentPath );
506
- return new ManagedDocumentLock (
507
- documentPath ,
508
- Arrays .stream (lockGroup .locks ).map (Tuple3 ::get_1 ).toArray (MultiLock []::new ),
509
- () -> unlockAll (lockGroup .locks , l -> lockTable .released (lockGroup .groupId , l ._3 , LockType .DOCUMENT , l ._2 ))
510
- );
492
+ return new ManagedLockGroupDocumentLock (documentPath , lockGroup , lockTable );
511
493
} else {
512
494
final long groupId = System .nanoTime ();
513
495
final String path = documentPath .toString ();
@@ -523,10 +505,7 @@ public ManagedDocumentLock acquireDocumentReadLock(final XmldbURI documentPath)
523
505
throw new LockException ("Unable to acquire READ_LOCK for: " + path );
524
506
}
525
507
526
- return new ManagedDocumentLock (documentPath , lock , () -> {
527
- lock .asReadLock ().unlock ();
528
- lockTable .released (groupId , path , LockType .DOCUMENT , Lock .LockMode .READ_LOCK );
529
- });
508
+ return new ManagedSingleLockDocumentLock (documentPath , groupId , lock , Lock .LockMode .READ_LOCK , lockTable );
530
509
}
531
510
}
532
511
@@ -542,11 +521,7 @@ public ManagedDocumentLock acquireDocumentReadLock(final XmldbURI documentPath)
542
521
public ManagedDocumentLock acquireDocumentWriteLock (final XmldbURI documentPath ) throws LockException {
543
522
if (usePathLocksForDocuments ) {
544
523
final LockGroup lockGroup = acquirePathWriteLock (LockType .DOCUMENT , documentPath , false );
545
- return new ManagedDocumentLock (
546
- documentPath ,
547
- Arrays .stream (lockGroup .locks ).map (Tuple3 ::get_1 ).toArray (MultiLock []::new ),
548
- () -> unlockAll (lockGroup .locks , l -> lockTable .released (lockGroup .groupId , l ._3 , LockType .DOCUMENT , l ._2 ))
549
- );
524
+ return new ManagedLockGroupDocumentLock (documentPath , lockGroup , lockTable );
550
525
} else {
551
526
final long groupId = System .nanoTime ();
552
527
final String path = documentPath .toString ();
@@ -561,10 +536,7 @@ public ManagedDocumentLock acquireDocumentWriteLock(final XmldbURI documentPath)
561
536
throw new LockException ("Unable to acquire WRITE_LOCK for: " + path );
562
537
}
563
538
564
- return new ManagedDocumentLock (documentPath , lock , () -> {
565
- lock .asWriteLock ().unlock ();
566
- lockTable .released (groupId , path , LockType .DOCUMENT , Lock .LockMode .WRITE_LOCK );
567
- });
539
+ return new ManagedSingleLockDocumentLock (documentPath , groupId , lock , Lock .LockMode .WRITE_LOCK , lockTable );
568
540
}
569
541
}
570
542
0 commit comments