ruby-changes:46489
From: normal <ko1@a...>
Date: Mon, 8 May 2017 10:59:21 +0900 (JST)
Subject: [ruby-changes:46489] normal:r58608 (trunk): reduce rb_mutex_t size from 80 bytes to 72 bytes on 64-bit
normal 2017-05-08 10:59:17 +0900 (Mon, 08 May 2017) New Revision: 58608 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=58608 Log: reduce rb_mutex_t size from 80 bytes to 72 bytes on 64-bit We can use existing RVALUE flags to avoid adding a 4-byte integer to store a boolean flag. This integer cost us 8 bytes due to default (lack of) struct packing on x86-64 * thread_sync.c (MUTEX_ALLOW_TRAP): define as FL_USER1 (struct rb_mutex_struct): remove allow_trap (rb_mutex_lock): adjust for flag check (rb_mutex_allow_trap): adjust for flag set/unset Modified files: trunk/thread_sync.c Index: thread_sync.c =================================================================== --- thread_sync.c (revision 58607) +++ thread_sync.c (revision 58608) @@ -12,11 +12,12 @@ struct mutex_waiter { https://github.com/ruby/ruby/blob/trunk/thread_sync.c#L12 struct list_node node; }; +#define MUTEX_ALLOW_TRAP FL_USER1 + typedef struct rb_mutex_struct { struct rb_thread_struct volatile *th; struct rb_mutex_struct *next_mutex; struct list_head waitq; /* protected by GVL */ - int allow_trap; } rb_mutex_t; #if defined(HAVE_WORKING_FORK) @@ -206,7 +207,8 @@ rb_mutex_lock(VALUE self) https://github.com/ruby/ruby/blob/trunk/thread_sync.c#L207 GetMutexPtr(self, mutex); /* When running trap handler */ - if (!mutex->allow_trap && th->interrupt_mask & TRAP_INTERRUPT_MASK) { + if (!FL_TEST_RAW(self, MUTEX_ALLOW_TRAP) && + th->interrupt_mask & TRAP_INTERRUPT_MASK) { rb_raise(rb_eThreadError, "can't be called from trap context"); } @@ -478,10 +480,12 @@ rb_mutex_synchronize_m(VALUE self, VALUE https://github.com/ruby/ruby/blob/trunk/thread_sync.c#L480 void rb_mutex_allow_trap(VALUE self, int val) { - rb_mutex_t *m; - GetMutexPtr(self, m); + Check_TypedStruct(self, &mutex_data_type); - m->allow_trap = val; + if (val) + FL_SET_RAW(self, MUTEX_ALLOW_TRAP); + else + FL_UNSET_RAW(self, MUTEX_ALLOW_TRAP); } /* Queue */ -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/