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

ruby-changes:20798

From: mrkn <ko1@a...>
Date: Fri, 5 Aug 2011 00:06:32 +0900 (JST)
Subject: [ruby-changes:20798] mrkn:r32846 (trunk): * thread_pthread.c (native_cond_signal): retry to call pthread_cond_signal

mrkn	2011-08-05 00:06:20 +0900 (Fri, 05 Aug 2011)

  New Revision: 32846

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32846

  Log:
    * thread_pthread.c (native_cond_signal): retry to call pthread_cond_signal
      and pthread_cond_broadcast if they return EAGAIN in
      native_cond_signal and native_cond_broadcast, respectively.
      It is for the pthread implementation of Mac OS X 10.7 (Lion).
      fixes #5155.  [ruby-dev:44342].
    * thread_pthread.c (native_cond_broadcast): ditto.
    * thread_pthread.c (struct cached_thread_entry): stop using
      pthread_cond_t and its functions directly.
    * thread_pthread.c (register_cached_thread_and_wait): ditto.
    * thread_pthread.c (use_cached_thread): ditto.

  Modified files:
    trunk/ChangeLog
    trunk/thread_pthread.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32845)
+++ ChangeLog	(revision 32846)
@@ -1,3 +1,20 @@
+Thu Aug  4 23:48:00 2011  Kenta Murata  <mrkn@m...>
+
+	* thread_pthread.c (native_cond_signal): retry to call pthread_cond_signal
+	  and pthread_cond_broadcast if they return EAGAIN in
+	  native_cond_signal and native_cond_broadcast, respectively.
+	  It is for the pthread implementation of Mac OS X 10.7 (Lion).
+	  fixes #5155.  [ruby-dev:44342].
+
+	* thread_pthread.c (native_cond_broadcast): ditto.
+
+	* thread_pthread.c (struct cached_thread_entry): stop using
+	  pthread_cond_t and its functions directly.
+
+	* thread_pthread.c (register_cached_thread_and_wait): ditto.
+
+	* thread_pthread.c (use_cached_thread): ditto.
+
 Thu Aug  4 20:29:41 2011  Naohisa Goto  <ngotogenome@g...>
 
 	* configure.in: when Solaris cc, use $(CC) to link shared libs.
Index: thread_pthread.c
===================================================================
--- thread_pthread.c	(revision 32845)
+++ thread_pthread.c	(revision 32846)
@@ -267,10 +267,23 @@
     }
 }
 
+/*
+ * In OS X 10.7 (Lion), pthread_cond_signal and pthread_cond_broadcast return
+ * EAGAIN after retrying 8196 times.  You can see them in the following page:
+ *
+ * http://www.opensource.apple.com/source/Libc/Libc-763.11/pthreads/pthread_cond.c
+ *
+ * The following native_cond_signal and native_cond_broadcast functions
+ * need to retrying until pthread functions don't return EAGAIN.
+ */
+
 static void
 native_cond_signal(rb_thread_cond_t *cond)
 {
-    int r = pthread_cond_signal(&cond->cond);
+    int r;
+    do {
+	r = pthread_cond_signal(&cond->cond);
+    } while (r == EAGAIN);
     if (r != 0) {
 	rb_bug_errno("pthread_cond_signal", r);
     }
@@ -279,7 +292,10 @@
 static void
 native_cond_broadcast(rb_thread_cond_t *cond)
 {
-    int r = pthread_cond_broadcast(&cond->cond);
+    int r;
+    do {
+	r = pthread_cond_broadcast(&cond->cond);
+    } while (r == EAGAIN);
     if (r != 0) {
 	rb_bug_errno("native_cond_broadcast", r);
     }
@@ -658,7 +674,7 @@
 
 struct cached_thread_entry {
     volatile rb_thread_t **th_area;
-    pthread_cond_t *cond;
+    rb_thread_cond_t *cond;
     struct cached_thread_entry *next;
 };
 
@@ -670,7 +686,7 @@
 static rb_thread_t *
 register_cached_thread_and_wait(void)
 {
-    pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+    rb_thread_cond_t cond = { PTHREAD_COND_INITIALIZER, };
     volatile rb_thread_t *th_area = 0;
     struct cached_thread_entry *entry =
       (struct cached_thread_entry *)malloc(sizeof(struct cached_thread_entry));
@@ -688,7 +704,7 @@
 	entry->next = cached_thread_root;
 	cached_thread_root = entry;
 
-	pthread_cond_timedwait(&cond, &thread_cache_lock, &ts);
+	native_cond_timedwait(&cond, &thread_cache_lock, &ts);
 
 	{
 	    struct cached_thread_entry *e = cached_thread_root;
@@ -710,7 +726,7 @@
 	}
 
 	free(entry); /* ok */
-	pthread_cond_destroy(&cond);
+	native_cond_destroy(&cond);
     }
     pthread_mutex_unlock(&thread_cache_lock);
 
@@ -736,7 +752,7 @@
 	    }
 	}
 	if (result) {
-	    pthread_cond_signal(entry->cond);
+	    native_cond_signal(entry->cond);
 	}
 	pthread_mutex_unlock(&thread_cache_lock);
     }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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