summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>2012-12-26 17:29:05 +0100
committerEnrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>2012-12-26 17:29:05 +0100
commitf9b7d2a6eb831f2fccfe42d815ad29a5982753c4 (patch)
tree0672b9014ad13ac2e67d1712800b20c6bc9d24ae
parent1e2aab8adadef02be184e38cb555b7a58482cd97 (diff)
downloadvdr-plugin-inputdev-f9b7d2a6eb831f2fccfe42d815ad29a5982753c4.tar.gz
vdr-plugin-inputdev-f9b7d2a6eb831f2fccfe42d815ad29a5982753c4.tar.bz2
fixed unlink() operations
the vdr list implementation corrupts the containing list when unlinking the first element. Keep track of the containing list and call its Del() method.
-rw-r--r--inputdev.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/inputdev.c b/inputdev.c
index a281645..09a177b 100644
--- a/inputdev.c
+++ b/inputdev.c
@@ -17,6 +17,7 @@
#include "inputdev.h"
#include <algorithm>
+#include <cassert>
#define __STDC_FORMAT_MACROS // Required for format specifiers
#include <inttypes.h>
#include <unistd.h>
@@ -46,6 +47,14 @@ private:
dev_t dev_t_;
public:
+ // the vdr list implementation requires knowledge about the containing
+ // list when unlinking a object :(
+ enum {
+ lstNONE,
+ lstDEVICES,
+ lstGC
+ } container;
+
cInputDevice(cInputDeviceController &controller,
cString const &dev_path);
~cInputDevice();
@@ -477,6 +486,8 @@ void cInputDeviceController::cleanup_devices(void)
dev_mutex_.Lock();
while (gc_devices_.Count() > 0) {
class cInputDevice *dev = gc_devices_.First();
+
+ assert(dev->container == cInputDevice::lstGC);
gc_devices_.Del(dev, false);
dev_mutex_.Unlock();
@@ -556,8 +567,11 @@ void cInputDeviceController::remove_device(char const *dev_path)
if (dev != NULL) {
dev->stop(fd_epoll_);
- dev->Unlink();
+ assert(dev->container == cInputDevice::lstDEVICES);
+ devices_.Del(dev, false);
+
gc_devices_.Add(dev);
+ dev->container = cInputDevice::lstGC;
}
}
@@ -573,8 +587,20 @@ void cInputDeviceController::remove_device(class cInputDevice *dev)
dev->stop(fd_epoll_);
dev_mutex_.Lock();
- dev->Unlink();
+ switch (dev->container) {
+ case cInputDevice::lstDEVICES:
+ devices_.Del(dev, false);
+ break;
+ case cInputDevice::lstGC:
+ gc_devices_.Del(dev, false);
+ break;
+ case cInputDevice::lstNONE:
+ break;
+ }
+
gc_devices_.Add(dev);
+ dev->container = cInputDevice::lstGC;
+
dev_mutex_.Unlock();
}
@@ -611,6 +637,7 @@ bool cInputDeviceController::add_device(char const *dev_name)
isyslog("%s: added input device '%s' (%s)\n",
plugin_name(), dev_name, desc);
devices_.Add(dev);
+ dev->container = cInputDevice::lstDEVICES;
}
}