summaryrefslogtreecommitdiff
path: root/thread_sync.c
diff options
context:
space:
mode:
authornormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-08-26 12:41:16 (GMT)
committernormal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-08-26 12:41:16 (GMT)
commit70d6c1a102aea1a26ae4799c4ce67451618c8bcc (patch)
tree3a7d5a92cdc69bb768af14ff5a8cc8a66ea559bc /thread_sync.c
parent84859fd2d22de75d360ef5b875d1ed5e25df02fb (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.c27
1 files changed, 11 insertions, 16 deletions
diff --git a/thread_sync.c b/thread_sync.c
index 4ed559a..5244d9f 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;
}