diff options
| author | Jean Boussier <jean.boussier@gmail.com> | 2026-01-31 22:57:35 +0100 |
|---|---|---|
| committer | Jean Boussier <jean.boussier@gmail.com> | 2026-02-01 12:17:29 +0100 |
| commit | 1276c233eac42d78016027a35b9e728427b215d2 (patch) | |
| tree | f9799e15259097a1f931feb38da120e1d6a729c5 | |
| parent | 4d5cd811656bd34a68db9990bebd9fc75043780d (diff) | |
thread.c: use ruby_sized_xfree for fdset and interupt tasks
| -rw-r--r-- | thread.c | 54 |
1 files changed, 31 insertions, 23 deletions
@@ -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); |
