diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-08-26 12:41:16 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-08-26 12:41:16 +0000 |
commit | 70d6c1a102aea1a26ae4799c4ce67451618c8bcc (patch) | |
tree | 3a7d5a92cdc69bb768af14ff5a8cc8a66ea559bc /thread_sync.c | |
parent | 84859fd2d22de75d360ef5b875d1ed5e25df02fb (diff) |
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
Diffstat (limited to 'thread_sync.c')
-rw-r--r-- | thread_sync.c | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/thread_sync.c b/thread_sync.c index 4ed559ad67..5244d9f3c9 100644 --- a/thread_sync.c +++ b/thread_sync.c @@ -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_all(struct list_head *head) +wakeup_one(struct list_head *head) { - struct sync_waiter *cur = 0, *next; + sync_wakeup(head, 1); +} - 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; - } - } +static void +wakeup_all(struct list_head *head) +{ + 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; } |