vdev_posix: change filemap into a static list of objects instead of pointers

to avoid dynamic memory allocations & frees (specifically in orb_exists)
This commit is contained in:
Beat Küng
2017-10-18 08:40:32 +02:00
committed by Lorenz Meier
parent 2668055358
commit d096ec0b61
+14 -17
View File
@@ -60,14 +60,14 @@ volatile bool sim_delay = false;
extern "C" { extern "C" {
#define PX4_MAX_FD 350 #define PX4_MAX_FD 350
static device::file_t *filemap[PX4_MAX_FD] = {}; static device::file_t filemap[PX4_MAX_FD] = {};
int px4_errno; int px4_errno;
inline bool valid_fd(int fd) inline bool valid_fd(int fd)
{ {
pthread_mutex_lock(&filemutex); pthread_mutex_lock(&filemutex);
bool ret = (fd < PX4_MAX_FD && fd >= 0 && filemap[fd] != nullptr); bool ret = (fd < PX4_MAX_FD && fd >= 0 && filemap[fd].vdev);
pthread_mutex_unlock(&filemutex); pthread_mutex_unlock(&filemutex);
return ret; return ret;
} }
@@ -75,11 +75,11 @@ extern "C" {
inline CDev *get_vdev(int fd) inline CDev *get_vdev(int fd)
{ {
pthread_mutex_lock(&filemutex); pthread_mutex_lock(&filemutex);
bool valid = (fd < PX4_MAX_FD && fd >= 0 && filemap[fd] != nullptr); bool valid = (fd < PX4_MAX_FD && fd >= 0 && filemap[fd].vdev);
CDev *dev; CDev *dev;
if (valid) { if (valid) {
dev = (CDev *)(filemap[fd]->vdev); dev = (CDev *)(filemap[fd].vdev);
} else { } else {
dev = nullptr; dev = nullptr;
@@ -115,8 +115,8 @@ extern "C" {
pthread_mutex_lock(&filemutex); pthread_mutex_lock(&filemutex);
for (i = 0; i < PX4_MAX_FD; ++i) { for (i = 0; i < PX4_MAX_FD; ++i) {
if (filemap[i] == nullptr) { if (filemap[i].vdev == nullptr) {
filemap[i] = new device::file_t(flags, dev, i); filemap[i] = device::file_t(flags, dev);
break; break;
} }
} }
@@ -124,7 +124,7 @@ extern "C" {
pthread_mutex_unlock(&filemutex); pthread_mutex_unlock(&filemutex);
if (i < PX4_MAX_FD) { if (i < PX4_MAX_FD) {
ret = dev->open(filemap[i]); ret = dev->open(&filemap[i]);
} else { } else {
@@ -167,13 +167,10 @@ extern "C" {
if (dev) { if (dev) {
pthread_mutex_lock(&filemutex); pthread_mutex_lock(&filemutex);
ret = dev->close(filemap[fd]); ret = dev->close(&filemap[fd]);
if (filemap[fd] != nullptr) { filemap[fd].vdev = nullptr;
delete filemap[fd];
}
filemap[fd] = nullptr;
pthread_mutex_unlock(&filemutex); pthread_mutex_unlock(&filemutex);
PX4_DEBUG("px4_close fd = %d", fd); PX4_DEBUG("px4_close fd = %d", fd);
@@ -197,7 +194,7 @@ extern "C" {
if (dev) { if (dev) {
PX4_DEBUG("px4_read fd = %d", fd); PX4_DEBUG("px4_read fd = %d", fd);
ret = dev->read(filemap[fd], (char *)buffer, buflen); ret = dev->read(&filemap[fd], (char *)buffer, buflen);
} else { } else {
ret = -EINVAL; ret = -EINVAL;
@@ -219,7 +216,7 @@ extern "C" {
if (dev) { if (dev) {
PX4_DEBUG("px4_write fd = %d", fd); PX4_DEBUG("px4_write fd = %d", fd);
ret = dev->write(filemap[fd], (const char *)buffer, buflen); ret = dev->write(&filemap[fd], (const char *)buffer, buflen);
} else { } else {
ret = -EINVAL; ret = -EINVAL;
@@ -241,7 +238,7 @@ extern "C" {
CDev *dev = get_vdev(fd); CDev *dev = get_vdev(fd);
if (dev) { if (dev) {
ret = dev->ioctl(filemap[fd], cmd, arg); ret = dev->ioctl(&filemap[fd], cmd, arg);
} else { } else {
ret = -EINVAL; ret = -EINVAL;
@@ -302,7 +299,7 @@ extern "C" {
// If fd is valid // If fd is valid
if (dev) { if (dev) {
PX4_DEBUG("%s: px4_poll: CDev->poll(setup) %d", thread_name, fds[i].fd); PX4_DEBUG("%s: px4_poll: CDev->poll(setup) %d", thread_name, fds[i].fd);
ret = dev->poll(filemap[fds[i].fd], &fds[i], true); ret = dev->poll(&filemap[fds[i].fd], &fds[i], true);
if (ret < 0) { if (ret < 0) {
PX4_WARN("%s: px4_poll() error: %s", PX4_WARN("%s: px4_poll() error: %s",
@@ -363,7 +360,7 @@ extern "C" {
// If fd is valid // If fd is valid
if (dev) { if (dev) {
PX4_DEBUG("%s: px4_poll: CDev->poll(teardown) %d", thread_name, fds[i].fd); PX4_DEBUG("%s: px4_poll: CDev->poll(teardown) %d", thread_name, fds[i].fd);
ret = dev->poll(filemap[fds[i].fd], &fds[i], false); ret = dev->poll(&filemap[fds[i].fd], &fds[i], false);
if (ret < 0) { if (ret < 0) {
PX4_WARN("%s: px4_poll() 2nd poll fail", thread_name); PX4_WARN("%s: px4_poll() 2nd poll fail", thread_name);