summaryrefslogtreecommitdiff
path: root/src/lib/checker.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2018-11-13 00:04:23 +0000
committerCarl Hetherington <cth@carlh.net>2018-11-13 00:04:23 +0000
commit264583479e79b481251f1772b228f82cd77552d3 (patch)
tree868f3347c1784ecde6ee626f6799334f3ef235b6 /src/lib/checker.cc
parentf80010debf14112a632f42ddc7588995698b3d19 (diff)
swaroop: only allow playback if configured lock file is present.v2.13.72
Diffstat (limited to 'src/lib/checker.cc')
-rw-r--r--src/lib/checker.cc95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/lib/checker.cc b/src/lib/checker.cc
new file mode 100644
index 000000000..13d9aacee
--- /dev/null
+++ b/src/lib/checker.cc
@@ -0,0 +1,95 @@
+/*
+ Copyright (C) 2018 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+
+#include "checker.h"
+#include "config.h"
+#include "cross.h"
+
+using boost::bind;
+using boost::ref;
+
+Checker::Checker (int period)
+ : _thread (0)
+ , _terminate (false)
+ , _ok (true)
+ , _period (period)
+{
+
+}
+
+void
+Checker::run ()
+{
+ _thread = new boost::thread (boost::bind (&Checker::thread, this));
+}
+
+Checker::~Checker ()
+{
+ {
+ boost::mutex::scoped_lock lm (_mutex);
+ _terminate = true;
+ }
+
+ if (_thread) {
+ /* Ideally this would be a DCPOMATIC_ASSERT(_thread->joinable()) but we
+ can't throw exceptions from a destructor.
+ */
+ _thread->interrupt ();
+ try {
+ if (_thread->joinable ()) {
+ _thread->join ();
+ }
+ } catch (boost::thread_interrupted& e) {
+ /* No problem */
+ }
+ }
+ delete _thread;
+}
+
+void
+Checker::thread ()
+{
+ while (true) {
+ boost::mutex::scoped_lock lm (_mutex);
+ if (_terminate) {
+ break;
+ }
+
+ bool const was_ok = _ok;
+ _ok = check();
+ if (was_ok != _ok) {
+ emit (bind(boost::ref(StateChanged)));
+ }
+
+ lm.unlock ();
+ dcpomatic_sleep (_period);
+ }
+}
+
+bool
+Checker::ok () const
+{
+ boost::mutex::scoped_lock lm (_mutex);
+ return _ok;
+}
+
+#endif