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/