Extracted AssetManager.SyncTuple to com.riiablo.asset.SyncMessage

This commit is contained in:
Collin Smith
2021-11-07 01:15:13 -07:00
parent 428006fde4
commit 63360dc7e1
2 changed files with 47 additions and 42 deletions

View File

@ -25,7 +25,7 @@ public final class AssetManager implements Disposable {
final ObjectMap<Class, Adapter> adapters = new ObjectMap<>();
final Array<PriorityContainer<FileHandleResolver>> resolvers = new Array<>();
final ObjectMap<Class, Class<? extends AssetParams>> defaultParams = new ObjectMap<>();
final BlockingQueue<SyncTuple> syncQueue = new LinkedBlockingQueue<>();
final BlockingQueue<SyncMessage> syncQueue = new LinkedBlockingQueue<>();
final EventExecutor io;
final EventExecutor sync;
@ -158,7 +158,7 @@ public final class AssetManager implements Disposable {
@SuppressWarnings("unchecked") // guaranteed by loader contract
T object = (T) loader.loadAsync(AssetManager.this, asset, handle, future.getNow());
log.debug("Asset Async complete: {}", asset);
boolean inserted = syncQueue.offer(SyncTuple.wrap(container, promise, loader, object));
boolean inserted = syncQueue.offer(SyncMessage.wrap(container, promise, loader, object));
if (!inserted) log.error("Failed to enqueue {}", asset);
log.debug("Queue added {} {}", inserted, syncQueue.size());
}
@ -182,49 +182,14 @@ public final class AssetManager implements Disposable {
// TODO: intended as a "process until something is synced" for testing
public boolean update() {
SyncTuple sync;
while ((sync = syncQueue.poll()) != null) {
log.debug("Asset Sync: {}", sync.container.asset);
sync.loadSync(this);
SyncMessage msg;
while ((msg = syncQueue.poll()) != null) {
log.debug("Asset Sync: {}", msg.container.asset);
msg.loadSync(this);
log.debug("Asset Loaded: {}", msg.container.asset);
return true;
}
return false;
}
static final class SyncTuple<T> {
static <T> SyncTuple<T> wrap(
AssetContainer container,
Promise<T> promise,
AssetLoader loader,
T object
) {
return new SyncTuple<>(container, promise, loader, object);
}
final AssetContainer container;
final Promise<T> promise;
final AssetLoader loader;
final T object;
SyncTuple(
AssetContainer container,
Promise<T> promise,
AssetLoader loader,
T object
) {
assert container.promise == promise : "container.promise != promise";
this.container = container;
this.promise = promise;
this.loader = loader;
this.object = object;
}
@SuppressWarnings("unchecked") // guaranteed by loader contract
Future<?> loadSync(AssetManager assets) {
loader.loadSync(assets, container.asset, object);
promise.setSuccess(object);
log.debug("Asset Loaded: {}", container.asset);
return promise;
}
}
}

View File

@ -0,0 +1,40 @@
package com.riiablo.asset;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.Promise;
final class SyncMessage<T> {
static <T> SyncMessage<T> wrap(
AssetContainer container,
Promise<T> promise,
AssetLoader loader,
T object
) {
return new SyncMessage<>(container, promise, loader, object);
}
final AssetContainer container;
final Promise<T> promise;
final AssetLoader loader;
final T object;
SyncMessage(
AssetContainer container,
Promise<T> promise,
AssetLoader loader,
T object
) {
assert container.promise == promise : "container.promise != promise";
this.container = container;
this.promise = promise;
this.loader = loader;
this.object = object;
}
@SuppressWarnings("unchecked") // guaranteed by loader contract
Future<?> loadSync(AssetManager assets) {
loader.loadSync(assets, container.asset, object);
promise.setSuccess(object);
return promise;
}
}