summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2026-01-31 22:57:35 +0100
committerJean Boussier <jean.boussier@gmail.com>2026-02-01 12:17:29 +0100
commit1276c233eac42d78016027a35b9e728427b215d2 (patch)
treef9799e15259097a1f931feb38da120e1d6a729c5
parent4d5cd811656bd34a68db9990bebd9fc75043780d (diff)
thread.c: use ruby_sized_xfree for fdset and interupt tasks
-rw-r--r--thread.c54
1 files changed, 31 insertions, 23 deletions
diff --git a/thread.c b/thread.c
index e66352c03f..bdca1e2469 100644
--- a/thread.c
+++ b/thread.c
@@ -4251,13 +4251,20 @@ rb_fd_init(rb_fdset_t *fds)
FD_ZERO(fds->fdset);
}
+static inline size_t
+fdset_memsize(int maxfd)
+{
+ size_t o = howmany(maxfd, NFDBITS) * sizeof(fd_mask);
+ if (o < sizeof(fd_set)) {
+ return sizeof(fd_set);
+ }
+ return o;
+}
+
void
rb_fd_init_copy(rb_fdset_t *dst, rb_fdset_t *src)
{
- size_t size = howmany(rb_fd_max(src), NFDBITS) * sizeof(fd_mask);
-
- if (size < sizeof(fd_set))
- size = sizeof(fd_set);
+ size_t size = fdset_memsize(rb_fd_max(src));
dst->maxfd = src->maxfd;
dst->fdset = xmalloc(size);
memcpy(dst->fdset, src->fdset, size);
@@ -4266,7 +4273,7 @@ rb_fd_init_copy(rb_fdset_t *dst, rb_fdset_t *src)
void
rb_fd_term(rb_fdset_t *fds)
{
- xfree(fds->fdset);
+ ruby_sized_xfree(fds->fdset, fdset_memsize(fds->maxfd));
fds->maxfd = 0;
fds->fdset = 0;
}
@@ -4281,14 +4288,11 @@ rb_fd_zero(rb_fdset_t *fds)
static void
rb_fd_resize(int n, rb_fdset_t *fds)
{
- size_t m = howmany(n + 1, NFDBITS) * sizeof(fd_mask);
- size_t o = howmany(fds->maxfd, NFDBITS) * sizeof(fd_mask);
-
- if (m < sizeof(fd_set)) m = sizeof(fd_set);
- if (o < sizeof(fd_set)) o = sizeof(fd_set);
+ size_t m = fdset_memsize(n + 1);
+ size_t o = fdset_memsize(fds->maxfd);
if (m > o) {
- fds->fdset = xrealloc(fds->fdset, m);
+ fds->fdset = ruby_sized_xrealloc(fds->fdset, m, o);
memset((char *)fds->fdset + o, 0, m - o);
}
if (n >= fds->maxfd) fds->maxfd = n + 1;
@@ -4318,23 +4322,18 @@ rb_fd_isset(int n, const rb_fdset_t *fds)
void
rb_fd_copy(rb_fdset_t *dst, const fd_set *src, int max)
{
- size_t size = howmany(max, NFDBITS) * sizeof(fd_mask);
-
- if (size < sizeof(fd_set)) size = sizeof(fd_set);
+ size_t size = fdset_memsize(max);
+ dst->fdset = ruby_sized_xrealloc(dst->fdset, size, fdset_memsize(dst->maxfd));
dst->maxfd = max;
- dst->fdset = xrealloc(dst->fdset, size);
memcpy(dst->fdset, src, size);
}
void
rb_fd_dup(rb_fdset_t *dst, const rb_fdset_t *src)
{
- size_t size = howmany(rb_fd_max(src), NFDBITS) * sizeof(fd_mask);
-
- if (size < sizeof(fd_set))
- size = sizeof(fd_set);
+ size_t size = fdset_memsize(rb_fd_max(src));
+ dst->fdset = ruby_sized_xrealloc(dst->fdset, size, fdset_memsize(dst->maxfd));
dst->maxfd = src->maxfd;
- dst->fdset = xrealloc(dst->fdset, size);
memcpy(dst->fdset, src->fdset, size);
}
@@ -4386,10 +4385,19 @@ rb_fd_init_copy(rb_fdset_t *dst, rb_fdset_t *src)
rb_fd_dup(dst, src);
}
+static inline size_t
+fdset_memsize(int capa)
+{
+ if (capa == FD_SETSIZE) {
+ return sizeof(fd_set);
+ }
+ return sizeof(unsigned int) + (capa * sizeof(SOCKET));
+}
+
void
rb_fd_term(rb_fdset_t *set)
{
- xfree(set->fdset);
+ ruby_sized_xfree(set->fdset, fdset_memsize(set->capa));
set->fdset = NULL;
set->capa = 0;
}
@@ -6265,7 +6273,7 @@ threadptr_interrupt_exec_exec(rb_thread_t *th)
else {
(*task->func)(task->data);
}
- ruby_xfree(task);
+ SIZED_FREE(task);
}
else {
break;
@@ -6281,7 +6289,7 @@ threadptr_interrupt_exec_cleanup(rb_thread_t *th)
struct rb_interrupt_exec_task *task;
while ((task = ccan_list_pop(&th->interrupt_exec_tasks, struct rb_interrupt_exec_task, node)) != NULL) {
- ruby_xfree(task);
+ SIZED_FREE(task);
}
}
rb_native_mutex_unlock(&th->interrupt_lock);