Skip to content

Commit

Permalink
Changing threading from per-region to per-world
Browse files Browse the repository at this point in the history
Remove complicated AsyncManager system
  • Loading branch information
kitskub committed Sep 14, 2014
1 parent 052d87b commit 8438d57
Show file tree
Hide file tree
Showing 48 changed files with 327 additions and 1,541 deletions.
4 changes: 2 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -295,8 +295,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<source>1.8</source>
<target>1.8</target>
<compilerArguments>
<O>-Xlint:all</O>
<O>-Xlint:-path</O>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,15 @@ public class PlayerControlledMovementComponent extends EntityComponent {

@Override
public void onTick(float dt) {
Player controller = this.controller;
if (controller == null) {
Player player = this.controller;
if (player == null) {
return;
}
final Vector3f right = getRight(getOwner().getPhysics().getRotation());
final Vector3f up = getUp(getOwner().getPhysics().getRotation());
final Vector3f forward = getForward(getOwner().getPhysics().getRotation());
Vector3f translation = Vector3f.ZERO;
List<InputSnapshot> input = controller.getInput();
List<InputSnapshot> input = player.getInput();
for (InputSnapshot snapshot : input) {
if (!snapshot.isMouseGrabbed()) {
continue;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/flowpowered/engine/FlowClientImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public void init() {
// TEST CODE
FlowWorld world = new FlowWorld(this, "TestWorld");
worldManager.addWorld(world);
getScheduler().addAsyncManager(world);
world.getThread().start();
}

@Override
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/com/flowpowered/engine/FlowEngine.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import com.flowpowered.engine.geo.world.FlowWorldManager;
import com.flowpowered.engine.plugins.FlowPluginManager;
import com.flowpowered.engine.scheduler.FlowScheduler;
import com.flowpowered.engine.util.thread.snapshotable.SnapshotManager;

public interface FlowEngine extends Engine {

Expand All @@ -45,5 +44,5 @@ public interface FlowEngine extends Engine {
@Override
FlowWorldManager<? extends FlowWorld> getWorldManager();

SnapshotManager getSnapshotManager();
void copySnapshot();
}
33 changes: 2 additions & 31 deletions src/main/java/com/flowpowered/engine/FlowEngineImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,23 +35,18 @@
import com.flowpowered.events.EventManager;
import com.flowpowered.events.SimpleEventManager;
import com.flowpowered.api.material.MaterialRegistry;
import com.flowpowered.api.scheduler.TickStage;
import com.flowpowered.api.util.SyncedStringMap;
import com.flowpowered.commons.bit.ShortBitMask;
import com.flowpowered.engine.filesystem.FlowFileSystem;
import com.flowpowered.engine.scheduler.FlowScheduler;
import com.flowpowered.engine.util.thread.CopySnapshotManager;
import com.flowpowered.engine.util.thread.snapshotable.SnapshotManager;

import uk.org.lidalia.slf4jext.Level;

public abstract class FlowEngineImpl implements FlowEngine, CopySnapshotManager {
public abstract class FlowEngineImpl implements FlowEngine {
private final FlowApplication args;
private final EventManager eventManager;
private final FlowFileSystem fileSystem;
private final FlowPluginManager pluginManager;
private FlowScheduler scheduler;
protected final SnapshotManager snapshotManager = new SnapshotManager();
private SyncedStringMap itemMap;
private PrintStream realSystemOut;
private PrintStream realSystemErr;
Expand Down Expand Up @@ -92,7 +87,6 @@ public void init() {
public void start() {
pluginManager.loadPlugins();
pluginManager.enablePlugins();
scheduler.addAsyncManager(this);
scheduler.startMainThread();
System.out.println("Engine started.");
}
Expand Down Expand Up @@ -140,29 +134,6 @@ public String getName() {
return "Flow Engine";
}

@Override
public SnapshotManager getSnapshotManager() {
return snapshotManager;
}

@Override
public void copySnapshotRun(int sequence) {
snapshotManager.copyAllSnapshots();
}

@Override
public boolean checkSequence(TickStage stage, int sequence) {
switch (stage) {
case SNAPSHOT:
return sequence == 0;
}
return true;
}

private final ShortBitMask STAGES = TickStage.SNAPSHOT;
@Override
public ShortBitMask getTickStages() {
return STAGES;
public void copySnapshot() {
}

}
9 changes: 7 additions & 2 deletions src/main/java/com/flowpowered/engine/FlowServerImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public class FlowServerImpl extends FlowEngineImpl implements FlowServer {

public FlowServerImpl(FlowApplication args) {
super(args);
players = new SnapshotableLinkedHashMap<>(snapshotManager);
players = new SnapshotableLinkedHashMap<>(null);
worldManager = new FlowServerWorldManager(this);
}

Expand Down Expand Up @@ -111,7 +111,7 @@ public FlowPlayer getPlayer(String name, boolean exact) {

@Override
public FlowPlayer addPlayer(String name, FlowSession session) {
FlowPlayer player = new FlowPlayer(snapshotManager, session, name);
FlowPlayer player = new FlowPlayer(session, name);
players.put(player.getName(), player);
session.setPlayer(player);

Expand All @@ -127,4 +127,9 @@ protected void addPlayer(FlowPlayer player) {
public FlowServerWorldManager getWorldManager() {
return worldManager;
}

@Override
public void copySnapshot() {
players.copySnapshot();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ public void preSnapshotRun() {
}

/**
* Snapshots the manager and all the entities managed in the SNAPSHOT tickstage.
* Snapshots the manager and all the entities managed in the SNAPSHOT WorldTickStage.
*/
public void copyAllSnapshots() {
for (FlowEntity e : entities.get().values()) {
Expand Down
50 changes: 6 additions & 44 deletions src/main/java/com/flowpowered/engine/geo/region/FlowRegion.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,7 @@
import com.flowpowered.api.material.BlockMaterial;
import com.flowpowered.api.material.block.BlockFace;
import com.flowpowered.api.player.Player;
import com.flowpowered.api.scheduler.TickStage;
import com.flowpowered.api.util.cuboid.CuboidBlockMaterialBuffer;
import com.flowpowered.commons.bit.ShortBitMask;
import com.flowpowered.commons.bit.ShortBitSet;
import com.flowpowered.commons.store.block.impl.AtomicPaletteBlockStore;
import com.flowpowered.engine.FlowEngine;
import com.flowpowered.engine.entity.EntityManager;
Expand All @@ -57,15 +54,15 @@
import com.flowpowered.engine.geo.world.FlowWorld;
import com.flowpowered.engine.physics.FlowLinkedWorldInfo;
import com.flowpowered.engine.util.math.ReactConverter;
import com.flowpowered.engine.util.thread.CompleteAsyncManager;
import com.flowpowered.engine.scheduler.WorldTickStage;
import com.flowpowered.events.Cause;
import com.flowpowered.math.GenericMath;
import com.flowpowered.math.vector.Vector3f;
import org.apache.logging.log4j.Level;
import org.spout.physics.engine.DynamicsWorld;
import org.spout.physics.engine.linked.LinkedDynamicsWorld;

public class FlowRegion extends Region implements CompleteAsyncManager {
public class FlowRegion extends Region {
private final RegionGenerator generator;
/**
* Reference to the persistent ByteArrayArray that stores chunk data
Expand Down Expand Up @@ -142,9 +139,9 @@ public FlowChunk getChunk(final int x, final int y, final int z, final LoadOptio
// If we're not waiting, then we don't care because it's async anyways
if (loadopt.isWait()) {
if (loadopt.generateIfNeeded()) {
TickStage.checkStage(TickStage.noneOf(TickStage.SNAPSHOT, TickStage.PRESNAPSHOT, TickStage.LIGHTING));
((FlowWorld) getWorld().get()).getThread().checkStage(WorldTickStage.noneOf(WorldTickStage.COPY_SNAPSHOT, WorldTickStage.PRESNAPSHOT, WorldTickStage.LIGHTING));
} else if (loadopt.loadIfNeeded()) {
TickStage.checkStage(TickStage.noneOf(TickStage.SNAPSHOT));
((FlowWorld) getWorld().get()).getThread().checkStage(WorldTickStage.noneOf(WorldTickStage.COPY_SNAPSHOT));
}
}

Expand All @@ -166,7 +163,7 @@ public FlowChunk getChunk(final int x, final int y, final int z, final LoadOptio
return loadOrGenChunkImmediately(x, y, z, loadopt);
}

engine.getScheduler().runCoreAsyncTask(new Runnable() {
engine.getScheduler().getTaskManager().runCoreAsyncTask(new Runnable() {
@Override
public void run() {
loadOrGenChunkImmediately(x, y, z, loadopt);
Expand Down Expand Up @@ -464,24 +461,20 @@ public EntityManager getEntityManager() {
return entityManager;
}

@Override
public void finalizeRun() {
entityManager.finalizeRun();
}

@Override
public void preSnapshotRun() {
entityManager.preSnapshotRun();
}

@Override
public void copySnapshotRun(int sequence) {
public void copySnapshotRun() {
entityManager.copyAllSnapshots();
chunks.set(live.get());
snapshot.update(this);
}

@Override
public void startTickRun(int stage, long delta) {
if (stage == 0) {
updateEntities(delta);
Expand Down Expand Up @@ -514,37 +507,6 @@ private void updateDynamics(float dt) {
}
}

@Override
public void runPhysics(int sequence) {
}

@Override
public void runDynamicUpdates(long threshold, int sequence) {
}

@Override
public void runLighting(int sequence) {
}

@Override
public boolean checkSequence(TickStage stage, int seqence) {
if (stage == TickStage.SNAPSHOT) {
return seqence == -1;
}
return seqence == -1;
}

@Override
public long getFirstDynamicUpdateTime() {
return 0;
}

private static ShortBitSet ALL_STAGES = new ShortBitSet(Short.MAX_VALUE);
@Override
public ShortBitMask getTickStages() {
return ALL_STAGES;
}

public FlowWorld getFlowWorld() {
return (FlowWorld) super.getWorld().refresh(engine.getWorldManager());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
import com.flowpowered.api.geo.ServerWorld;
import com.flowpowered.api.geo.World;
import com.flowpowered.api.geo.cuboid.Region;
import com.flowpowered.api.scheduler.TickStage;
import com.flowpowered.engine.scheduler.WorldTickStage;
import com.flowpowered.api.util.thread.annotation.DelayedWrite;
import com.flowpowered.api.util.thread.annotation.LiveRead;
import com.flowpowered.commons.concurrent.TripleIntObjectReferenceArrayMap;
Expand Down Expand Up @@ -63,7 +63,7 @@ public RegionSource(FlowEngine engine, FlowWorld world) {

@DelayedWrite
public void removeRegion(final FlowRegion r) {
TickStage.checkStage(TickStage.SNAPSHOT);
((FlowWorld) r.getWorld().get()).getThread().checkStage(WorldTickStage.COPY_SNAPSHOT);

if (!r.getWorld().equals(world)) {
throw new IllegalArgumentException("Provided region's world is not the same world as this RegionSource's world!");
Expand All @@ -88,8 +88,6 @@ public void removeRegion(final FlowRegion r) {
return;
}

world.getEngine().getScheduler().removeAsyncManager(r);

if (regionsLoaded.decrementAndGet() < 0) {
engine.getLogger().info("Regions loaded dropped below zero");
}
Expand All @@ -108,7 +106,7 @@ public void removeRegion(final FlowRegion r) {
public FlowRegion getRegion(int x, int y, int z, LoadOption loadopt) {
if (loadopt != LoadOption.NO_LOAD) {
// TEST CODE how do we handle async chunk additions on the client?
//TickStage.checkStage(TickStage.noneOf(TickStage.SNAPSHOT));
//TickStage.checkStage(TickStage.noneOf(TickStage.COPY_SNAPSHOT));
}

FlowRegion region = loadedRegions.get(x, y, z);
Expand All @@ -129,7 +127,6 @@ public FlowRegion getRegion(int x, int y, int z, LoadOption loadopt) {
return current;
}

world.getEngine().getScheduler().addAsyncManager(region);
return region;
}
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,11 @@ public boolean accept(Path entry) throws IOException {

@Override
public FlowServerWorld loadWorld(String name, WorldGenerator generator) {
if (loadedWorlds.get().containsKey((name))) {
return loadedWorlds.get().get(name);
if (loadedWorlds.containsKey((name))) {
return loadedWorlds.get(name);
}
if (loadedWorlds.getLive().containsKey(name)) {
return loadedWorlds.getLive().get(name);
if (loadedWorlds.containsKey(name)) {
return loadedWorlds.get(name);
}

if (generator == null) {
Expand All @@ -85,7 +85,6 @@ public FlowServerWorld loadWorld(String name, WorldGenerator generator) {
return oldWorld;
}

engine.getScheduler().addAsyncManager(world);
//getEventManager().callDelayedEvent(new WorldLoadEvent(world));
return world;
}
Expand Down Expand Up @@ -124,7 +123,7 @@ public WorldGenerator getDefaultGenerator() {

@Override
public boolean unloadWorld(String name, boolean save) {
return unloadWorld((ServerWorld) loadedWorlds.getLive().get(name), save);
return unloadWorld((ServerWorld) loadedWorlds.get(name), save);
}

@Override
Expand All @@ -137,7 +136,6 @@ public boolean unloadWorld(ServerWorld world, boolean save) {
boolean success = loadedWorlds.remove(world.getName(), w);
if (success) {
if (save) {
engine.getScheduler().removeAsyncManager(w);
//getEventManager().callDelayedEvent(new WorldUnloadEvent(world));
w.unload(save);
}
Expand Down
Loading

0 comments on commit 8438d57

Please sign in to comment.