thread_sync.c: common wakeup_{one,all} implementation

This let us avoid looping in rb_szqueue_max_set, saves us
some lines of code and reduces binary size slightly
(numbers from 32-bit x86):

         text      data     bss     dec     hex filename
before: 91272       392     156   91820   166ac thread.o
 after: 91200       392     156   91748   16664 thread.o

Inspiration from this taken from the FUTEX_WAKE op
of the Linux futex(2) syscall.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64542 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
normal 2018-08-26 12:41:16 +00:00
Родитель 84859fd2d2
Коммит 70d6c1a102
1 изменённых файлов: 11 добавлений и 16 удалений

Просмотреть файл

@ -12,8 +12,8 @@ struct sync_waiter {
#define MUTEX_ALLOW_TRAP FL_USER1
static int
wakeup_one(struct list_head *head)
static void
sync_wakeup(struct list_head *head, long max)
{
struct sync_waiter *cur = 0, *next;
@ -22,24 +22,21 @@ wakeup_one(struct list_head *head)
if (cur->th->status != THREAD_KILLED) {
rb_threadptr_interrupt(cur->th);
cur->th->status = THREAD_RUNNABLE;
return TRUE;
if (--max == 0) return;
}
}
return FALSE;
}
static void
wakeup_one(struct list_head *head)
{
sync_wakeup(head, 1);
}
static void
wakeup_all(struct list_head *head)
{
struct sync_waiter *cur = 0, *next;
list_for_each_safe(head, cur, next, node) {
list_del_init(&cur->node);
if (cur->th->status != THREAD_KILLED) {
rb_threadptr_interrupt(cur->th);
cur->th->status = THREAD_RUNNABLE;
}
}
sync_wakeup(head, LONG_MAX);
}
/* Mutex */
@ -1112,9 +1109,7 @@ rb_szqueue_max_set(VALUE self, VALUE vmax)
diff = max - sq->max;
}
sq->max = max;
while (diff-- > 0 && wakeup_one(szqueue_pushq(sq))) {
/* keep waking more up */
}
sync_wakeup(szqueue_pushq(sq), diff);
return vmax;
}