From 06987c624481201495334fa114e90a2ff26331c1 Mon Sep 17 00:00:00 2001 From: Lorenz Meier Date: Mon, 2 Nov 2015 11:05:09 +0100 Subject: [PATCH] Lock vdev devmap --- src/drivers/device/vdev.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/drivers/device/vdev.cpp b/src/drivers/device/vdev.cpp index 60761ed511..4aa58447f3 100644 --- a/src/drivers/device/vdev.cpp +++ b/src/drivers/device/vdev.cpp @@ -67,6 +67,7 @@ private: #define PX4_MAX_DEV 500 static px4_dev_t *devmap[PX4_MAX_DEV]; +pthread_mutex_t devmutex = PTHREAD_MUTEX_INITIALIZER; /* * The standard NuttX operation dispatch table can't call C++ member functions @@ -142,8 +143,12 @@ VDev::register_driver(const char *name, void *data) // Make sure the device does not already exist // FIXME - convert this to a map for efficiency + + pthread_mutex_lock(&devmutex); + for (int i = 0; i < PX4_MAX_DEV; ++i) { if (devmap[i] && (strcmp(devmap[i]->name, name) == 0)) { + pthread_mutex_unlock(&devmutex); return -EEXIST; } } @@ -157,6 +162,8 @@ VDev::register_driver(const char *name, void *data) } } + pthread_mutex_unlock(&devmutex); + if (ret != PX4_OK) { PX4_ERR("No free devmap entries - increase PX4_MAX_DEV"); } @@ -174,6 +181,8 @@ VDev::unregister_driver(const char *name) return -EINVAL; } + pthread_mutex_lock(&devmutex); + for (int i = 0; i < PX4_MAX_DEV; ++i) { if (devmap[i] && (strcmp(name, devmap[i]->name) == 0)) { delete devmap[i]; @@ -184,6 +193,8 @@ VDev::unregister_driver(const char *name) } } + pthread_mutex_unlock(&devmutex); + return ret; } @@ -194,15 +205,20 @@ VDev::unregister_class_devname(const char *class_devname, unsigned class_instanc char name[32]; snprintf(name, sizeof(name), "%s%u", class_devname, class_instance); + pthread_mutex_lock(&devmutex); + for (int i = 0; i < PX4_MAX_DEV; ++i) { if (devmap[i] && strcmp(devmap[i]->name, name) == 0) { delete devmap[i]; PX4_DEBUG("Unregistered class DEV %s", name); devmap[i] = NULL; + pthread_mutex_unlock(&devmutex); return PX4_OK; } } + pthread_mutex_unlock(&devmutex); + return -EINVAL; } @@ -497,15 +513,20 @@ VDev *VDev::getDev(const char *path) PX4_DEBUG("VDev::getDev"); int i = 0; + pthread_mutex_lock(&devmutex); + for (; i < PX4_MAX_DEV; ++i) { //if (devmap[i]) { // printf("%s %s\n", devmap[i]->name, path); //} if (devmap[i] && (strcmp(devmap[i]->name, path) == 0)) { + pthread_mutex_unlock(&devmutex); return (VDev *)(devmap[i]->cdev); } } + pthread_mutex_unlock(&devmutex); + return NULL; } @@ -514,11 +535,15 @@ void VDev::showDevices() int i = 0; PX4_INFO("Devices:"); + pthread_mutex_lock(&devmutex); + for (; i < PX4_MAX_DEV; ++i) { if (devmap[i] && strncmp(devmap[i]->name, "/dev/", 5) == 0) { PX4_INFO(" %s", devmap[i]->name); } } + + pthread_mutex_unlock(&devmutex); } void VDev::showTopics() @@ -526,11 +551,15 @@ void VDev::showTopics() int i = 0; PX4_INFO("Devices:"); + pthread_mutex_lock(&devmutex); + for (; i < PX4_MAX_DEV; ++i) { if (devmap[i] && strncmp(devmap[i]->name, "/obj/", 5) == 0) { PX4_INFO(" %s", devmap[i]->name); } } + + pthread_mutex_unlock(&devmutex); } void VDev::showFiles() @@ -538,12 +567,16 @@ void VDev::showFiles() int i = 0; PX4_INFO("Files:"); + pthread_mutex_lock(&devmutex); + for (; i < PX4_MAX_DEV; ++i) { if (devmap[i] && strncmp(devmap[i]->name, "/obj/", 5) != 0 && strncmp(devmap[i]->name, "/dev/", 5) != 0) { PX4_INFO(" %s", devmap[i]->name); } } + + pthread_mutex_unlock(&devmutex); } const char *VDev::topicList(unsigned int *next)