diff options
author | Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> | 2013-01-06 13:35:56 +0100 |
---|---|---|
committer | Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> | 2013-01-06 13:39:45 +0100 |
commit | 30b1f3ae49c63e8e96ef04f692910cac77d44901 (patch) | |
tree | e5c68f6a2ba3872c77e051413fe9253d663b3a2d | |
parent | a077661b413539085aeb800cd025025f8f45995c (diff) | |
download | vdr-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.cc | 36 |
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); |