diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-08 01:59:17 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-05-08 01:59:17 +0000 |
commit | 774420eba03beeed4ac8b99a28f271b3dfa312dc (patch) | |
tree | c7f4f4c8fd4a5d00de6bfd9d9d886586e8397f5d /thread_sync.c | |
parent | cdc85aec31e165ef33c234cb3ecd7528c01957c7 (diff) |
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
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58608 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread_sync.c')
-rw-r--r-- | thread_sync.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/thread_sync.c b/thread_sync.c index 6f7919867c..bfd625d001 100644 --- a/thread_sync.c +++ b/thread_sync.c @@ -12,11 +12,12 @@ struct mutex_waiter { 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) 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 args) 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 */ |