diff --git a/webcam-capture/src/main/java/com/github/sarxos/webcam/WebcamLock.java b/webcam-capture/src/main/java/com/github/sarxos/webcam/WebcamLock.java index d14e9c75..b052389e 100644 --- a/webcam-capture/src/main/java/com/github/sarxos/webcam/WebcamLock.java +++ b/webcam-capture/src/main/java/com/github/sarxos/webcam/WebcamLock.java @@ -52,6 +52,9 @@ public LockUpdater() { @Override public void run() { do { + if (disabled.get()) { + return; + } update(); try { Thread.sleep(INTERVAL); @@ -79,6 +82,11 @@ public void run() { */ private AtomicBoolean locked = new AtomicBoolean(false); + /** + * Is lock completely disabled. + */ + private AtomicBoolean disabled = new AtomicBoolean(false); + /** * Lock file. */ @@ -102,6 +110,10 @@ private String getLockName() { private void write(long value) { + if (disabled.get()) { + return; + } + String name = getLockName(); File tmp = null; @@ -215,6 +227,10 @@ private void write(long value) { private long read() { + if (disabled.get()) { + return -1; + } + DataInputStream dis = null; long value = -1; @@ -249,6 +265,11 @@ private long read() { } private void update() { + + if (disabled.get()) { + return; + } + write(System.currentTimeMillis()); } @@ -257,6 +278,10 @@ private void update() { */ public void lock() { + if (disabled.get()) { + return; + } + if (isLocked()) { throw new WebcamLockException(String.format("Webcam %s has already been locked", webcam.getName())); } @@ -273,11 +298,30 @@ public void lock() { updater.start(); } + /** + * Completely disable locking mechanism. After this method is invoked, the + * lock will not have any effect on the webcam runtime. + */ + public void disable() { + if (disabled.compareAndSet(false, true)) { + LOG.info("Locking mechanism has been disabled in {}", webcam); + if (updater != null) { + updater.interrupt(); + } + } + } + /** * Unlock webcam. */ public void unlock() { + // do nothing when lock disabled + + if (disabled.get()) { + return; + } + if (!locked.compareAndSet(true, false)) { return; } @@ -300,6 +344,12 @@ public void unlock() { */ public boolean isLocked() { + // always return false when lock is disabled + + if (disabled.get()) { + return false; + } + // check if locked by current process if (locked.get()) {