summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>2013-01-06 13:35:56 +0100
committerEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>2013-01-06 13:39:45 +0100
commit30b1f3ae49c63e8e96ef04f692910cac77d44901 (patch)
treee5c68f6a2ba3872c77e051413fe9253d663b3a2d
parenta077661b413539085aeb800cd025025f8f45995c (diff)
downloadvdr-plugin-inputdev-30b1f3ae49c63e8e96ef04f692910cac77d44901.tar.gz
vdr-plugin-inputdev-30b1f3ae49c63e8e96ef04f692910cac77d44901.tar.bz2
ensure that start() and stop() are called with locked mutex
-rw-r--r--inputdev.cc36
1 files changed, 16 insertions, 20 deletions
diff --git a/inputdev.cc b/inputdev.cc
index a8e5015..3db8d76 100644
--- a/inputdev.cc
+++ b/inputdev.cc
@@ -827,16 +827,15 @@ void cInputDeviceController::remove_device(char const *dev_path)
void cInputDeviceController::remove_device(class cInputDevice *dev)
{
+ cMutexLock lock(&dev_mutex_);
+
dev->stop(fd_epoll_);
- dev_mutex_.Lock();
if (dev->container)
dev->container->Del(dev, false);
gc_devices_.Add(dev);
dev->container = &gc_devices_;
-
- dev_mutex_.Unlock();
}
bool cInputDeviceController::add_device(char const *dev_name)
@@ -854,28 +853,25 @@ bool cInputDeviceController::add_device(char const *dev_name)
desc = dev->get_description();
- {
- cMutexLock lock(&dev_mutex_);
-
- for (cInputDevice *i = devices_.First(); i;
- i = devices_.Next(i)) {
- if (dev->Compare(*i) == 0) {
- dsyslog("%s: device '%s' (%s) already registered\n",
- plugin_name(), dev_name, desc);
- delete dev;
- dev = NULL;
- break;
- }
- }
+ cMutexLock lock(&dev_mutex_);
- if (dev != NULL) {
- isyslog("%s: added input device '%s' (%s)\n",
+ for (cInputDevice *i = devices_.First(); i; i = devices_.Next(i)) {
+ if (dev->Compare(*i) == 0) {
+ dsyslog("%s: device '%s' (%s) already registered\n",
plugin_name(), dev_name, desc);
- devices_.Add(dev);
- dev->container = &devices_;
+ delete dev;
+ dev = NULL;
+ break;
}
}
+ if (dev != NULL) {
+ isyslog("%s: added input device '%s' (%s)\n",
+ plugin_name(), dev_name, desc);
+ devices_.Add(dev);
+ dev->container = &devices_;
+ }
+
if (dev != NULL && !dev->start(fd_epoll_)) {
res = false;
remove_device(dev);