ruby-changes:20805
From: mrkn <ko1@a...>
Date: Fri, 5 Aug 2011 10:10:16 +0900 (JST)
Subject: [ruby-changes:20805] mrkn:r32853 (ruby_1_9_3): Merge commit r32846:
mrkn 2011-08-05 10:10:02 +0900 (Fri, 05 Aug 2011) New Revision: 32853 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32853 Log: Merge commit r32846: * 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: branches/ruby_1_9_3/ChangeLog branches/ruby_1_9_3/thread_pthread.c Index: ruby_1_9_3/ChangeLog =================================================================== --- ruby_1_9_3/ChangeLog (revision 32852) +++ ruby_1_9_3/ChangeLog (revision 32853) @@ -1,3 +1,22 @@ +Thu Aug 5 10:09:00 2011 Kenta Murata <mrkn@m...> + + * backport r32846 from trunk. + + * 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. + Fri Aug 5 09:48:00 2011 Nobuyoshi Nakada <nobu@r...> Index: ruby_1_9_3/thread_pthread.c =================================================================== --- ruby_1_9_3/thread_pthread.c (revision 32852) +++ ruby_1_9_3/thread_pthread.c (revision 32853) @@ -267,10 +267,23 @@ } } +/* + * In OS X 10.7 (Lion), pthread_cond_signal and pthread_cond_broadcast return + * EAGAIN after retrying 8192 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/