From 686caf4ca401f4db14e64e5e52393c9cec6187a6 Mon Sep 17 00:00:00 2001 From: Lorenz Meier Date: Wed, 16 Sep 2015 17:10:24 +0200 Subject: [PATCH] Fix semaphore handling for device on Mac OS --- Build/.keep | 0 src/drivers/device/device_posix.cpp | 24 +++++++++++++++++++++++- src/drivers/device/vdev.cpp | 2 +- src/drivers/device/vdev.h | 7 ++++--- 4 files changed, 28 insertions(+), 5 deletions(-) delete mode 100644 Build/.keep diff --git a/Build/.keep b/Build/.keep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/drivers/device/device_posix.cpp b/src/drivers/device/device_posix.cpp index 5fc6a595ad..97cf2c8254 100644 --- a/src/drivers/device/device_posix.cpp +++ b/src/drivers/device/device_posix.cpp @@ -44,6 +44,7 @@ #include #include #include +#include namespace device { @@ -54,7 +55,24 @@ Device::Device(const char *name) : _name(name), _debug_enabled(false) { - sem_init(&_lock, 0, 1); + #ifndef __PX4_DARWIN + _lock = new sem_t; + int ret = sem_init(_lock, 0, 1); + + if (ret != 0) { + PX4_WARN("SEM INIT FAIL: ret %d, %s", ret, strerror(errno)); + } + #else + _lock_name = new char[strlen(_name) + 2]; + _lock_name[0] = '/'; + strcpy(&_lock_name[1], _name); + /* not using O_EXCL as the device handles are unique */ + _lock = sem_open(_lock_name, O_CREAT, 0777, 1); + + if (_lock == SEM_FAILED) { + PX4_WARN("SEM INIT FAIL: %s", strerror(errno)); + } + #endif /* setup a default device ID. When bus_type is UNKNOWN the other fields are invalid */ @@ -67,7 +85,11 @@ Device::Device(const char *name) : Device::~Device() { + #ifdef __PX4_DARWIN + sem_unlink(_name); + #else sem_destroy(&_lock); + #endif } int diff --git a/src/drivers/device/vdev.cpp b/src/drivers/device/vdev.cpp index 507cebbf83..430b121c09 100644 --- a/src/drivers/device/vdev.cpp +++ b/src/drivers/device/vdev.cpp @@ -64,7 +64,7 @@ private: px4_dev_t() {} }; -#define PX4_MAX_DEV 200 +#define PX4_MAX_DEV 500 static px4_dev_t *devmap[PX4_MAX_DEV]; /* diff --git a/src/drivers/device/vdev.h b/src/drivers/device/vdev.h index c39857bbf0..3b4aae01ed 100644 --- a/src/drivers/device/vdev.h +++ b/src/drivers/device/vdev.h @@ -161,6 +161,7 @@ public: protected: const char *_name; /**< driver name */ + char *_lock_name; /**< name of the semaphore */ bool _debug_enabled; /**< if true, debug messages are printed */ union DeviceId _device_id; /**< device identifier information */ @@ -180,7 +181,7 @@ protected: */ void lock() { DEVICE_DEBUG("lock"); - do {} while (sem_wait(&_lock) != 0); + do {} while (sem_wait(_lock) != 0); } /** @@ -188,11 +189,11 @@ protected: */ void unlock() { DEVICE_DEBUG("unlock"); - sem_post(&_lock); + sem_post(_lock); } private: - sem_t _lock; + sem_t * _lock; /** disable copy construction for this and all subclasses */ Device(const Device &);