[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]