package com.github.sarxos.webcam.util;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicBoolean;
import com.github.sarxos.webcam.WebcamException;
/**
* Atomic webcam initializer.
*
* @author Bartosz Firyn (sarxos)
*/
public class WebcamInitializer {
private final Initializable initializable;
private final AtomicBoolean initialized = new AtomicBoolean(false);
private final CountDownLatch latch = new CountDownLatch(1);
public WebcamInitializer(Initializable initializable) {
this.initializable = initializable;
}
public void initialize() {
if (initialized.compareAndSet(false, true)) {
try {
initializable.initialize();
} catch (Exception e) {
throw new WebcamException(e);
} finally {
latch.countDown();
}
} else {
try {
latch.await();
} catch (InterruptedException e) {
return;
}
}
}
public void teardown() {
if (initialized.compareAndSet(true, false)) {
try {
initializable.teardown();
} catch (Exception e) {
throw new WebcamException(e);
}
}
}
public boolean isInitialized() {
return initialized.get();
}
}