Skip to content
Snippets Groups Projects
Commit 955fdccf authored by Marek Vavrusa's avatar Marek Vavrusa
Browse files

Implemented mreserve() for reserving/trimming in fdsets.

refs #1291, #1582
parent 9530b4b6
No related branches found
No related tags found
No related merge requests found
......@@ -27,7 +27,6 @@
#include "skip-list.h"
#define OS_FDS_CHUNKSIZE 8 /*!< Number of pollfd structs in a chunk. */
#define OS_FDS_KEEPCHUNKS 32 /*!< Will attempt to free memory when reached. */
struct fdset_t {
fdset_base_t _base;
......@@ -76,23 +75,8 @@ int fdset_epoll_add(fdset_t *fdset, int fd, int events)
}
/* Realloc needed. */
if (fdset->nfds == fdset->reserved) {
const size_t chunk = OS_FDS_CHUNKSIZE;
const size_t nsize = (fdset->reserved + chunk) *
sizeof(struct epoll_event);
struct epoll_event *events_n = malloc(nsize);
if (!events_n) {
return -1;
}
/* Clear and copy old fdset data. */
memset(events_n, 0, nsize);
memcpy(events_n, fdset->events,
fdset->nfds * sizeof(struct epoll_event));
free(fdset->events);
fdset->events = events_n;
fdset->reserved += chunk;
}
mreserve(&fdset->events, sizeof(struct epoll_event), fdset->nfds + 1,
OS_FDS_CHUNKSIZE, &fdset->reserved);
/* Add to epoll set. */
struct epoll_event ev;
......@@ -123,7 +107,10 @@ int fdset_epoll_remove(fdset_t *fdset, int fd)
/* Overwrite current item. */
--fdset->nfds;
/*! \todo Return memory if unused (issue #1582). */
/* Trim excessive memory if possible (retval is not interesting). */
mreserve(&fdset->events, sizeof(struct epoll_event), fdset->nfds,
OS_FDS_CHUNKSIZE, &fdset->reserved);
return 0;
}
......
......@@ -37,6 +37,7 @@ struct fdset_t {
struct kevent *revents;
size_t nfds;
size_t reserved;
size_t rreserved;
size_t polled;
};
......@@ -76,24 +77,6 @@ int fdset_kqueue_destroy(fdset_t * fdset)
return 0;
}
int fdset_kqueue_realloc(struct kevent **old, size_t oldsize, size_t nsize)
{
void *nmem = malloc(nsize);
if (!nmem) {
return -1;
}
/* Clear and copy old fdset data. */
memset(nmem, 0, nsize);
if (oldsize > 0) {
memcpy(nmem, *old, oldsize);
free(*old);
}
*old = nmem;
return 0;
}
int fdset_kqueue_add(fdset_t *fdset, int fd, int events)
{
if (!fdset || fd < 0 || events <= 0) {
......@@ -101,20 +84,13 @@ int fdset_kqueue_add(fdset_t *fdset, int fd, int events)
}
/* Realloc needed. */
if (fdset->nfds == fdset->reserved) {
size_t chunk = OS_FDS_CHUNKSIZE;
size_t nsize = (fdset->reserved + chunk) *
sizeof(struct kevent);
size_t oldsize = fdset->nfds * sizeof(struct kevent);
if (fdset_kqueue_realloc(&fdset->events, oldsize, nsize) < 0) {
return -1;
}
if (fdset_kqueue_realloc(&fdset->revents, oldsize, nsize) < 0) {
return -1;
}
int ret = 0;
ret += mreserve(&fdset->events, sizeof(struct kevent), fdset->nfds + 1,
OS_FDS_CHUNKSIZE, &fdset->reserved);
ret += mreserve(&fdset->revents, sizeof(struct kevent), fdset->nfds + 1,
OS_FDS_CHUNKSIZE, &fdset->rreserved);
if (ret != 0) {
return ret;
}
/* Add to kqueue set. */
......@@ -156,7 +132,12 @@ int fdset_kqueue_remove(fdset_t *fdset, int fd)
/* Overwrite current item. */
--fdset->nfds;
/*! \todo Return memory if unused (issue #1582). */
/* Trim excessive memory if possible (retval is not interesting). */
mreserve(&fdset->events, sizeof(struct epoll_event), fdset->nfds,
OS_FDS_CHUNKSIZE, &fdset->reserved);
mreserve(&fdset->revents, sizeof(struct epoll_event), fdset->nfds,
OS_FDS_CHUNKSIZE, &fdset->rreserved);
return 0;
}
......
......@@ -26,7 +26,6 @@
#include "common/fdset_poll.h"
#define OS_FDS_CHUNKSIZE 8 /*!< Number of pollfd structs in a chunk. */
#define OS_FDS_KEEPCHUNKS 32 /*!< Will attempt to free memory when reached. */
struct fdset_t {
fdset_base_t _base;
......@@ -68,20 +67,9 @@ int fdset_poll_add(fdset_t *fdset, int fd, int events)
}
/* Realloc needed. */
if (fdset->nfds == fdset->reserved) {
const size_t chunk = OS_FDS_CHUNKSIZE;
const size_t nsize = sizeof(struct pollfd) * (fdset->reserved + chunk);
struct pollfd *fds_n = malloc(nsize);
if (!fds_n) {
return -1;
}
/* Clear and copy old fdset data. */
memset(fds_n, 0, nsize);
memcpy(fds_n, fdset->fds, fdset->nfds * sizeof(struct pollfd));
free(fdset->fds);
fdset->fds = fds_n;
fdset->reserved += chunk;
if (mreserve(&fdset->fds, sizeof(struct pollfd), fdset->nfds + 1,
OS_FDS_CHUNKSIZE, &fdset->reserved) < 0) {
return -1;
}
/* Append. */
......@@ -118,7 +106,10 @@ int fdset_poll_remove(fdset_t *fdset, int fd)
memmove(fdset->fds + pos, fdset->fds + (pos + 1), remaining);
--fdset->nfds;
/*! \todo Return memory if unused (issue #1582). */
/* Trim excessive memory if possible (retval is not interesting). */
mreserve(&fdset->fds, sizeof(struct pollfd), fdset->nfds,
OS_FDS_CHUNKSIZE, &fdset->reserved);
return 0;
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment