diff options
-rw-r--r-- | device.c | 10 | ||||
-rw-r--r-- | udev.c | 72 | ||||
-rw-r--r-- | udev.h | 83 |
3 files changed, 92 insertions, 73 deletions
@@ -95,16 +95,16 @@ cPvrDevice::cPvrDevice(int DeviceNumber, cDevice *ParentDevice) if (video_vcap.capabilities & V4L2_CAP_RADIO) supports_radio = true; - cUdev::Init(); - cUdevDevice *v4ldev = cUdev::GetDeviceFromDevName(*devName); + pvrinput::cUdev::Init(); + pvrinput::cUdevDevice *v4ldev = pvrinput::cUdev::GetDeviceFromDevName(*devName); if (v4ldev != NULL) { static const char *propertyName = "ID_PATH"; static const char *vbi_dev_node = "/dev/vbi"; static const char *radio_dev_node = "/dev/radio"; const char *id_path = v4ldev->GetPropertyValue(propertyName); if (id_path != NULL) { - cList<cUdevDevice> *v4ldevices = cUdev::EnumDevices("video4linux", propertyName, id_path); - for (cUdevDevice *dev = v4ldevices->First(); dev; dev = v4ldevices->Next(dev)) { + cList<pvrinput::cUdevDevice> *v4ldevices = pvrinput::cUdev::EnumDevices("video4linux", propertyName, id_path); + for (pvrinput::cUdevDevice *dev = v4ldevices->First(); dev; dev = v4ldevices->Next(dev)) { log(pvrDEBUG1, "pvrinput: %s is related to %s", *devName, dev->GetDevnode()); if (SupportsSlicedVBI && (*vbi_devname == NULL) && (strncmp(dev->GetDevnode(), vbi_dev_node, strlen(vbi_dev_node)) == 0)) vbi_devname = dev->GetDevnode(); @@ -115,7 +115,7 @@ cPvrDevice::cPvrDevice(int DeviceNumber, cDevice *ParentDevice) } delete v4ldev; } - cUdev::Free(); + pvrinput::cUdev::Free(); if (video_vcap.capabilities & V4L2_CAP_VIDEO_OUTPUT_OVERLAY) hasDecoder = true; //can only be a PVR350 @@ -3,16 +3,16 @@ // --- cUdevListEntry -------------------------------------------------------- -cUdevListEntry::cUdevListEntry(struct udev_list_entry *ListEntry) +pvrinput::cUdevListEntry::cUdevListEntry(struct udev_list_entry *ListEntry) :listEntry(ListEntry) { } -cUdevListEntry::~cUdevListEntry(void) +pvrinput::cUdevListEntry::~cUdevListEntry(void) { } -cUdevListEntry *cUdevListEntry::GetNext(void) const +pvrinput::cUdevListEntry *pvrinput::cUdevListEntry::GetNext(void) const { if (listEntry == NULL) return NULL; @@ -22,14 +22,14 @@ cUdevListEntry *cUdevListEntry::GetNext(void) const return new cUdevListEntry(next); } -const char *cUdevListEntry::GetName(void) const +const char *pvrinput::cUdevListEntry::GetName(void) const { if (listEntry == NULL) return NULL; return udev_list_entry_get_name(listEntry); } -const char *cUdevListEntry::GetValue(void) const +const char *pvrinput::cUdevListEntry::GetValue(void) const { if (listEntry == NULL) return NULL; @@ -38,19 +38,19 @@ const char *cUdevListEntry::GetValue(void) const // --- cUdevDevice ----------------------------------------------------------- -cUdevDevice::cUdevDevice(udev_device *Device, bool DoUnref) +pvrinput::cUdevDevice::cUdevDevice(udev_device *Device, bool DoUnref) :device(Device) ,doUnref(DoUnref) { } -cUdevDevice::~cUdevDevice(void) +pvrinput::cUdevDevice::~cUdevDevice(void) { if (doUnref && device) udev_device_unref(device); } -int cUdevDevice::Compare(const cListObject &ListObject) const +int pvrinput::cUdevDevice::Compare(const cListObject &ListObject) const { const char *n1 = GetDevnode(); const char *n2 = ((cUdevDevice*)&ListObject)->GetDevnode(); @@ -59,14 +59,14 @@ int cUdevDevice::Compare(const cListObject &ListObject) const return 0; } -const char *cUdevDevice::GetAction(void) const +const char *pvrinput::cUdevDevice::GetAction(void) const { if (device == NULL) return NULL; return udev_device_get_action(device); } -cUdevListEntry *cUdevDevice::GetDevlinksList(void) const +pvrinput::cUdevListEntry *pvrinput::cUdevDevice::GetDevlinksList(void) const { if (device == NULL) return NULL; @@ -76,21 +76,21 @@ cUdevListEntry *cUdevDevice::GetDevlinksList(void) const return new cUdevListEntry(listEntry); } -const char *cUdevDevice::GetDevnode(void) const +const char *pvrinput::cUdevDevice::GetDevnode(void) const { if (device == NULL) return false; return udev_device_get_devnode(device); } -const char *cUdevDevice::GetDevpath(void) const +const char *pvrinput::cUdevDevice::GetDevpath(void) const { if (device == NULL) return false; return udev_device_get_devpath(device); } -cUdevDevice *cUdevDevice::GetParent(void) const +pvrinput::cUdevDevice *pvrinput::cUdevDevice::GetParent(void) const { if (device == NULL) return NULL; @@ -100,28 +100,28 @@ cUdevDevice *cUdevDevice::GetParent(void) const return new cUdevDevice(parent, false); } -const char *cUdevDevice::GetPropertyValue(const char *Key) const +const char *pvrinput::cUdevDevice::GetPropertyValue(const char *Key) const { if (device == NULL) return false; return udev_device_get_property_value(device, Key); } -const char *cUdevDevice::GetSubsystem(void) const +const char *pvrinput::cUdevDevice::GetSubsystem(void) const { if (device == NULL) return false; return udev_device_get_subsystem(device); } -const char *cUdevDevice::GetSysname(void) const +const char *pvrinput::cUdevDevice::GetSysname(void) const { if (device == NULL) return false; return udev_device_get_sysname(device); } -const char *cUdevDevice::GetSyspath(void) const +const char *pvrinput::cUdevDevice::GetSyspath(void) const { if (device == NULL) return false; @@ -130,23 +130,37 @@ const char *cUdevDevice::GetSyspath(void) const // --- cUdev ----------------------------------------------------------------- -struct udev *cUdev::udev = NULL; +cMutex pvrinput::cUdev::udev_mutex; +int pvrinput::cUdev::udev_refcount = 0; +struct udev *pvrinput::cUdev::udev = NULL; -struct udev *cUdev::Init(void) +struct udev *pvrinput::cUdev::Init(void) { + udev_mutex.Lock(); if (udev == NULL) udev = udev_new(); + else + udev_ref(udev); + udev_refcount++; + udev_mutex.Unlock(); return udev; } -void cUdev::Free(void) +void pvrinput::cUdev::Free(void) { - if (udev) + udev_mutex.Lock(); + if (udev_refcount <= 0) + esyslog("udev: don't call cUdev::Free before cUdev::Init!"); + else { + udev_refcount--; udev_unref(udev); - udev = NULL; + if (udev_refcount <= 0) + udev = NULL; + } + udev_mutex.Unlock(); } -cUdevDevice *cUdev::GetDeviceFromDevName(const char *DevName) +pvrinput::cUdevDevice *pvrinput::cUdev::GetDeviceFromDevName(const char *DevName) { if (DevName == NULL) return NULL; @@ -166,7 +180,7 @@ cUdevDevice *cUdev::GetDeviceFromDevName(const char *DevName) return new cUdevDevice(dev); } -cUdevDevice *cUdev::GetDeviceFromSysPath(const char *SysPath) +pvrinput::cUdevDevice *pvrinput::cUdev::GetDeviceFromSysPath(const char *SysPath) { if (SysPath == NULL) return NULL; @@ -176,7 +190,7 @@ cUdevDevice *cUdev::GetDeviceFromSysPath(const char *SysPath) return new cUdevDevice(dev); } -cList<cUdevDevice> *cUdev::EnumDevices(const char *Subsystem, const char *Property, const char *Value) +cList<pvrinput::cUdevDevice> *pvrinput::cUdev::EnumDevices(const char *Subsystem, const char *Property, const char *Value) { cList<cUdevDevice> *devices = new cList<cUdevDevice>; struct udev_enumerate *e = udev_enumerate_new(udev); @@ -187,20 +201,20 @@ cList<cUdevDevice> *cUdev::EnumDevices(const char *Subsystem, const char *Proper if (e != NULL) { int rc = 0; if (Subsystem && ((rc = udev_enumerate_add_match_subsystem(e, Subsystem)) < 0)) { - esyslog("pvrinput: can't add subsystem %s to enum-filter: %d", Subsystem, rc); + esyslog("udev: can't add subsystem %s to enum-filter: %d", Subsystem, rc); goto unref; } if (Property && Value && ((rc = udev_enumerate_add_match_property(e, Property, Value)) < 0)) { - esyslog("pvrinput: can't add property %s value %s to enum-filter: %d", Property, Value, rc); + esyslog("udev: can't add property %s value %s to enum-filter: %d", Property, Value, rc); goto unref; } if ((rc = udev_enumerate_scan_devices(e)) < 0) { - esyslog("pvrinput: can't scan for devices: %d", rc); + esyslog("udev: can't scan for devices: %d", rc); goto unref; } l = udev_enumerate_get_list_entry(e); if (l == NULL) { - isyslog("pvrinput: no devices found for %s/%s=%s", Subsystem, Property, Value); + isyslog("udev: no devices found for %s/%s=%s", Subsystem, Property, Value); goto unref; } listEntry = new cUdevListEntry(l); @@ -4,48 +4,53 @@ #include <libudev.h> #include <vdr/tools.h> +#include <vdr/thread.h> -class cUdevListEntry { -private: - struct udev_list_entry *listEntry; -public: - cUdevListEntry(struct udev_list_entry *ListEntry); - virtual ~cUdevListEntry(void); - - cUdevListEntry *GetNext(void) const; - const char *GetName(void) const; - const char *GetValue(void) const; - }; +namespace pvrinput { + class cUdevListEntry { + private: + struct udev_list_entry *listEntry; + public: + cUdevListEntry(struct udev_list_entry *ListEntry); + virtual ~cUdevListEntry(void); + + cUdevListEntry *GetNext(void) const; + const char *GetName(void) const; + const char *GetValue(void) const; + }; -class cUdevDevice : public cListObject { -private: - struct udev_device *device; - bool doUnref; -public: - cUdevDevice(udev_device *Device, bool DoUnref = true); - virtual ~cUdevDevice(void); - virtual int Compare(const cListObject &ListObject) const; + class cUdevDevice : public cListObject { + private: + struct udev_device *device; + bool doUnref; + public: + cUdevDevice(udev_device *Device, bool DoUnref = true); + virtual ~cUdevDevice(void); + virtual int Compare(const cListObject &ListObject) const; - const char *GetAction(void) const; - cUdevListEntry *GetDevlinksList(void) const; - const char *GetDevnode(void) const; - const char *GetDevpath(void) const; - cUdevDevice *GetParent(void) const; - const char *GetPropertyValue(const char *Key) const; - const char *GetSubsystem(void) const; - const char *GetSysname(void) const; - const char *GetSyspath(void) const; - }; + const char *GetAction(void) const; + cUdevListEntry *GetDevlinksList(void) const; + const char *GetDevnode(void) const; + const char *GetDevpath(void) const; + cUdevDevice *GetParent(void) const; + const char *GetPropertyValue(const char *Key) const; + const char *GetSubsystem(void) const; + const char *GetSysname(void) const; + const char *GetSyspath(void) const; + }; -class cUdev { -private: - static struct udev *udev; -public: - static struct udev *Init(void); - static void Free(void); - static cUdevDevice *GetDeviceFromDevName(const char *DevName); - static cUdevDevice *GetDeviceFromSysPath(const char *SysPath); - static cList<cUdevDevice> *EnumDevices(const char *Subsystem, const char *Property, const char *Value); - }; + class cUdev { + private: + static cMutex udev_mutex; + static int udev_refcount; // newer libudev does this on its own + static struct udev *udev; + public: + static struct udev *Init(void); + static void Free(void); + static cUdevDevice *GetDeviceFromDevName(const char *DevName); + static cUdevDevice *GetDeviceFromSysPath(const char *SysPath); + static cList<cUdevDevice> *EnumDevices(const char *Subsystem, const char *Property, const char *Value); + }; +} #endif // __PVRINPUT_UDEV_H |