StorageManager class

Пакет: com.hypixel.hytale.server.core.universe

Файл: com/hypixel/hytale/server/core/universe/StorageManager.java

Поля (36)

МодификаторыТипИмя
private int activeLoads
private Supplier<CompletableFuture<Void>> doSave
final BooleanSupplier isSavingLocked
private CompletableFuture<Void> loadBarrier
private CompletableFuture<Void> onComplete
var1
var1
var1
long var1
long var1
Path var13
Path var14
Path var15
long var2
long var2
long var3
long var3
ArrayList var3
StorageManager.PendingOp var4
StorageManager.PendingOp var5
var5
var5
StorageManager.PendingOp var5
var5
CompletableFuture var5
var5
Path var5
CompletableFuture var6
CompletableFuture var6
long var6
StorageManager.PendingOp var6
Path var7
CompletableFuture var7
Supplier var7
StorageManager.PendingOp var8
CompletableFuture var8

Методы (17)

МодификаторыВозвратСигнатура
private PendingOpprivate PendingOp(@Nonnull CompletableFuture<Void> var1, @Nullable Supplier<CompletableFuture<Void>> var2)
private void clearSavevoid clearSave(@Nonnull Path var1)
public <T> CompletableFuture<T> doLoad<T> CompletableFuture<T> doLoad(@Nonnull Path var1, @Nonnull Supplier<CompletableFuture<T>> var2)
public CompletableFuture<Void> doSaveCompletableFuture<Void> doSave(@Nonnull Path var1, @Nonnull Supplier<CompletableFuture<Void>> var2)
public boolean hasQueuedSaveboolean hasQueuedSave(@Nonnull Path var1)
if if(var5 != null)
if if(var5.doSave != null)
if if(var4 != null)
if if(var5 != null && var5.activeLoads == 0)
if if(var5 == null)
if if(var8.activeLoads == 0)
if if(var5 != null)
if if(var5.doSave == null && var5.activeLoads <= 0)
if if(var6.doSave != null)
if if(var4x != null)
public void onSavingReleasevoid onSavingRelease()
public CompletableFuture<Void> pendingOperationsCompletableFuture<Void> pendingOperations()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.universe;

class="kw">import java.nio.file.Path;
class="kw">import java.util.ArrayList;
class="kw">import java.util.HashMap;
class="kw">import java.util.Map;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.locks.StampedLock;
class="kw">import java.util.function.BooleanSupplier;
class="kw">import java.util.function.Supplier;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class StorageManager {
   class="kw">private class="kw">final BooleanSupplier isSavingLocked;
   class="kw">private class="kw">final StampedLock lock = new StampedLock();
   class="kw">private class="kw">final Map<Path, StorageManager.PendingOp> pendingOps = new HashMap<>();

   class="kw">public StorageManager(BooleanSupplier var1) {
      this.isSavingLocked = var1;
   }

   class="kw">public boolean hasQueuedSave(@Nonnull Path var1) {
      var1 = var1.normalize();
      long var2 = this.lock.readLock();

      try {
         StorageManager.PendingOp var4 = this.pendingOps.get(var1);
         class="kw">return var4 != null && var4.activeLoads == 0;
      } class="kw">finally {
         this.lock.unlockRead(var2);
      }
   }

   class="kw">private void clearSave(@Nonnull Path var1) {
      long var2 = this.lock.writeLock();

      try {
         this.pendingOps.remove(var1);
      } class="kw">finally {
         this.lock.unlockWrite(var2);
      }
   }

   class="kw">public CompletableFuture<Void> doSave(@Nonnull Path var1, @Nonnull Supplier<CompletableFuture<Void>> var2) {
      var1 = var1.normalize();
      long var3 = this.lock.writeLock();

      try {
         StorageManager.PendingOp var5 = this.pendingOps.get(var1);
         if (var5 != null) {
            if (var5.doSave != null) {
               var5.doSave = var2;
               class="kw">return var5.onComplete;
            } else {
               Path var13 = var1;
               class="kw">return var5.onComplete = var5.onComplete.thenCompose(var3x -> this.doSave(var13, var2));
            }
         } else {
            CompletableFuture var6 = new CompletableFuture<>();
            if (this.isSavingLocked.getAsBoolean()) {
               var5 = new StorageManager.PendingOp(var6, var2);
            } else {
               Path var7 = var1;
               var2.get().whenCompleteAsync((var3x, var4) -> {
                  this.clearSave(var7);
                  if (var4 != null) {
                     var6.completeExceptionally(var4);
                  } else {
                     var6.complete(null);
                  }
               });
               var5 = new StorageManager.PendingOp(var6, null);
            }

            this.pendingOps.put(var1, var5);
            class="kw">return var6;
         }
      } class="kw">finally {
         this.lock.unlockWrite(var3);
      }
   }

   class="kw">public <T> CompletableFuture<T> doLoad(@Nonnull Path var1, @Nonnull Supplier<CompletableFuture<T>> var2) {
      var1 = var1.normalize();
      long var3 = this.lock.writeLock();

      try {
         StorageManager.PendingOp var5 = this.pendingOps.get(var1);
         if (var5 != null && var5.activeLoads == 0) {
            Path var14 = var1;
            class="kw">return var5.onComplete.thenCompose(var3x -> this.doLoad(var14, var2));
         }

         CompletableFuture var6 = var2.get();
         if (var5 == null) {
            CompletableFuture var7 = new CompletableFuture<>();
            var5 = new StorageManager.PendingOp(var7, null);
            var5.loadBarrier = var7;
            var5.activeLoads = 1;
            this.pendingOps.put(var1, var5);
         } else {
            var5.activeLoads++;
         }

         Path var15 = var1;
         StorageManager.PendingOp var8 = var5;
         var6.whenCompleteAsync((var3x, var4) -> {
            CompletableFuture var5 = null;
            long var6 = this.lock.writeLock();

            try {
               var8.activeLoads--;
               if (var8.activeLoads == 0) {
                  if (this.pendingOps.get(var15) == var8) {
                     this.pendingOps.remove(var15);
                  }

                  var5 = var8.loadBarrier;
               }
            } class="kw">finally {
               this.lock.unlockWrite(var6);
            }

            if (var5 != null) {
               var5.complete(null);
            }
         });
         class="kw">return var6;
      } class="kw">finally {
         this.lock.unlockWrite(var3);
      }
   }

   class="kw">public CompletableFuture<Void> pendingOperations() {
      long var1 = this.lock.readLock();

      try {
         ArrayList var3 = new ArrayList<>();

         for (StorageManager.PendingOp var5 : this.pendingOps.values()) {
            if (var5.doSave == null && var5.activeLoads <= 0) {
               var3.add(var5.onComplete);
            }
         }

         class="kw">return CompletableFuture.allOf(var3.toArray(CompletableFuture[]::new));
      } class="kw">finally {
         this.lock.unlockRead(var1);
      }
   }

   class="kw">public void onSavingRelease() {
      long var1 = this.lock.writeLock();

      try {
         for (Entry var4 : this.pendingOps.entrySet()) {
            Path var5 = var4.getKey();
            StorageManager.PendingOp var6 = var4.getValue();
            if (var6.doSave != null) {
               Supplier var7 = var6.doSave;
               var6.doSave = null;
               CompletableFuture var8 = var6.onComplete;
               var7.get().whenCompleteAsync((var3, var4x) -> {
                  this.clearSave(var5);
                  if (var4x != null) {
                     var8.completeExceptionally(var4x);
                  } else {
                     var8.complete(null);
                  }
               });
            }
         }
      } class="kw">finally {
         this.lock.unlockWrite(var1);
      }
   }

   class="kw">private class="kw">static class="kw">final class PendingOp {
      @Nonnull
      class="kw">private CompletableFuture<Void> onComplete;
      @Nullable
      class="kw">private Supplier<CompletableFuture<Void>> doSave;
      @Nullable
      class="kw">private CompletableFuture<Void> loadBarrier;
      class="kw">private int activeLoads;

      class="kw">private PendingOp(@Nonnull CompletableFuture<Void> var1, @Nullable Supplier<CompletableFuture<Void>> var2) {
         this.onComplete = var1;
         this.doSave = var2;
      }
   }
}