diff --git a/services/git-bridge/.idea/misc.xml b/services/git-bridge/.idea/misc.xml index 8a80acb0ff..66ed3bc26d 100644 --- a/services/git-bridge/.idea/misc.xml +++ b/services/git-bridge/.idea/misc.xml @@ -3,6 +3,7 @@ + @@ -13,5 +14,4 @@ - - + \ No newline at end of file diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/Main.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/Main.java index e7594dcdd3..5dd5a7e941 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/Main.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/Main.java @@ -2,8 +2,6 @@ package uk.ac.ic.wlgitbridge; import uk.ac.ic.wlgitbridge.application.WLGitBridgeApplication; -import java.nio.file.Paths; - /** * Created by Winston on 01/11/14. */ diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/LockAllWaiter.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/LockAllWaiter.java new file mode 100644 index 0000000000..1b35dbf1b7 --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/LockAllWaiter.java @@ -0,0 +1,10 @@ +package uk.ac.ic.wlgitbridge.writelatex; + +/** + * Created by Winston on 21/02/15. + */ +public interface LockAllWaiter { + + public void threadsRemaining(int threads); + +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/ProjectLock.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/ProjectLock.java index 9cf07d86fc..6732b42208 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/ProjectLock.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/ProjectLock.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; /** * Created by Winston on 20/11/14. @@ -11,17 +12,44 @@ import java.util.concurrent.locks.ReentrantLock; public class ProjectLock { private final Map projectLocks; + private final ReentrantReadWriteLock rwlock; + private final Lock rlock; + private final ReentrantReadWriteLock.WriteLock wlock; + private LockAllWaiter waiter; + private boolean waiting; public ProjectLock() { projectLocks = new HashMap(); + rwlock = new ReentrantReadWriteLock(); + rlock = rwlock.readLock(); + wlock = rwlock.writeLock(); + waiting = false; } public void lockForProject(String projectName) { getLockForProjectName(projectName).lock(); + rlock.lock(); } public void unlockForProject(String projectName) { getLockForProjectName(projectName).unlock(); + rlock.unlock(); + if (waiting) { + trySignal(); + } + } + + private void trySignal() { + int threads = rwlock.getReadLockCount(); + if (waiter != null && threads > 0) { + waiter.threadsRemaining(threads); + } + } + + public void lockAll() { + waiting = true; + trySignal(); + wlock.lock(); } private synchronized Lock getLockForProjectName(String projectName) { @@ -33,4 +61,8 @@ public class ProjectLock { return lock; } + public void setWaiter(LockAllWaiter waiter) { + this.waiter = waiter; + } + } diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/ShutdownHook.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/ShutdownHook.java new file mode 100644 index 0000000000..0455154592 --- /dev/null +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/ShutdownHook.java @@ -0,0 +1,30 @@ +package uk.ac.ic.wlgitbridge.writelatex; + +import uk.ac.ic.wlgitbridge.util.Util; + +/** + * Created by Winston on 21/02/15. + */ +public class ShutdownHook extends Thread implements LockAllWaiter { + + private final ProjectLock projectLock; + + public ShutdownHook(ProjectLock projectLock) { + this.projectLock = projectLock; + projectLock.setWaiter(this); + } + + @Override + public void run() { + Util.sout("Shutdown received."); + projectLock.lockAll(); + Util.sout("No projects to wait for."); + Util.sout("Bye"); + } + + @Override + public void threadsRemaining(int threads) { + Util.sout("Waiting for " + threads + " projects..."); + } + +} diff --git a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/WriteLatexAPI.java b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/WriteLatexAPI.java index f72d33845d..20dc063a32 100644 --- a/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/WriteLatexAPI.java +++ b/services/git-bridge/src/main/java/uk/ac/ic/wlgitbridge/writelatex/WriteLatexAPI.java @@ -31,6 +31,7 @@ public class WriteLatexAPI implements WriteLatexDataSource { this.dataModel = dataModel; postbackManager = new PostbackManager(); mainProjectLock = new ProjectLock(); + Runtime.getRuntime().addShutdownHook(new ShutdownHook(mainProjectLock)); } @Override