mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-30 07:13:34 +08:00
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:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user