mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* thread_pthread.c (native_thread_init_stack): use get_stack.
patched by KOSAKI Motohiro [ruby-dev:40309] * thread_pthread.c (ruby_init_stack): use get_stack on platforms which have pthread_attr_get_np. (FreeBSD, DragonFlyBSD and NetBSD) This is because FreeBSD and DragonFly BSD must use pthread_attr_get_np to get stack size of main thread, but Mac OS X and Linux with LinuxThreads must use getrlimit. <http://www.nminoru.jp/~nminoru/programming/stackoverflow_handling.html> <http://d.hatena.ne.jp/nurse/20100204> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26572 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									669862a416
								
							
						
					
					
						commit
						b323b86b6b
					
				
					 3 changed files with 32 additions and 24 deletions
				
			
		
							
								
								
									
										18
									
								
								ChangeLog
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								ChangeLog
									
										
									
									
									
								
							|  | @ -1,8 +1,22 @@ | |||
| Thu Feb  4 15:47:27 2010  NARUSE, Yui  <naruse@ruby-lang.org> | ||||
| 
 | ||||
| 	* thread_pthread.c (native_thread_init_stack): use get_stack. | ||||
| 	  patched by KOSAKI Motohiro [ruby-dev:40309] | ||||
| 
 | ||||
| 	* thread_pthread.c (ruby_init_stack): use get_stack | ||||
| 	  on platforms which have pthread_attr_get_np. | ||||
| 	  (FreeBSD, DragonFlyBSD and NetBSD) | ||||
| 	  This is because FreeBSD and DragonFly BSD must use | ||||
| 	  pthread_attr_get_np to get stack size of main thread, | ||||
| 	  but Mac OS X and Linux with LinuxThreads must use getrlimit. | ||||
| 	  <http://www.nminoru.jp/~nminoru/programming/stackoverflow_handling.html> | ||||
| 	  <http://d.hatena.ne.jp/nurse/20100204> | ||||
| 
 | ||||
| Thu Feb  4 09:55:38 2010  NARUSE, Yui  <naruse@ruby-lang.org> | ||||
| 
 | ||||
| 	* configure.in: FreeBSD, DragonFly BSD and Mac OS X needs | ||||
| 	* configure.in: FreeBSD, DragonFly BSD and OpenBSD needs | ||||
| 	  pthread_np.h to use pthread_*_np functions. | ||||
| 	  Mac OS X's pthread_*_np also depend sys/signal.h, | ||||
| 	  OpenBSD's pthread_*_np also depend sys/signal.h, | ||||
| 	  but it is included at signal.h via vm_core.h via thread.c. | ||||
| 
 | ||||
| Thu Feb  4 08:15:53 2010  Nobuyoshi Nakada  <nobu@ruby-lang.org> | ||||
|  |  | |||
|  | @ -12,9 +12,6 @@ | |||
| #ifdef THREAD_SYSTEM_DEPENDENT_IMPLEMENTATION | ||||
| 
 | ||||
| #include "gc.h" | ||||
| #if defined(__FreeBSD__) || defined(__DragonFly) | ||||
| #include <pthread_np.h> | ||||
| #endif | ||||
| 
 | ||||
| #ifdef HAVE_SYS_RESOURCE_H | ||||
| #include <sys/resource.h> | ||||
|  | @ -234,10 +231,10 @@ get_stack(void **addr, size_t *size) | |||
|     CHECK_ERR(pthread_attr_getstacksize(&attr, size)); | ||||
| # endif | ||||
|     CHECK_ERR(pthread_attr_getguardsize(&attr, &guard)); | ||||
|     *size -= guard; | ||||
| # ifndef HAVE_PTHREAD_GETATTR_NP | ||||
|     pthread_attr_destroy(&attr); | ||||
| # endif | ||||
|     size -= guard; | ||||
| #elif defined HAVE_PTHREAD_GET_STACKADDR_NP && defined HAVE_PTHREAD_GET_STACKSIZE_NP | ||||
|     pthread_t th = pthread_self(); | ||||
|     *addr = pthread_get_stackaddr_np(th); | ||||
|  | @ -296,14 +293,11 @@ ruby_init_stack(volatile VALUE *addr | |||
|     } | ||||
| #endif | ||||
|     { | ||||
| 	size_t size = 0, space = 0; | ||||
| #if defined(__FreeBSD__) || defined(__DragonFly) | ||||
| 	pthread_attr_t attr; | ||||
| 	if (pthread_attr_init(&attr) == 0) { | ||||
| 	    if (pthread_attr_get_np(native_main_thread.id, &attr) == 0) | ||||
| 		pthread_attr_getstacksize(&attr, &size); | ||||
| 	    pthread_attr_destroy(&attr); | ||||
| 	} | ||||
| 	size_t size = 0; | ||||
| 	size_t space = 0; | ||||
| #if defined(HAVE_PTHREAD_ATTR_GET_NP) | ||||
| 	void* addr; | ||||
| 	get_stack(&addr, &size); | ||||
| #elif defined(HAVE_GETRLIMIT) | ||||
| 	struct rlimit rlim; | ||||
| 	if (getrlimit(RLIMIT_STACK, &rlim) == 0) { | ||||
|  | @ -328,17 +322,14 @@ native_thread_init_stack(rb_thread_t *th) | |||
| 	th->machine_stack_maxsize = native_main_thread.stack_maxsize; | ||||
|     } | ||||
|     else { | ||||
| #ifdef HAVE_PTHREAD_GETATTR_NP | ||||
| 	pthread_attr_t attr; | ||||
| #ifdef STACKADDR_AVAILABLE | ||||
| 	void *start; | ||||
| 	CHECK_ERR(pthread_getattr_np(curr, &attr)); | ||||
| # if defined HAVE_PTHREAD_ATTR_GETSTACK | ||||
| 	CHECK_ERR(pthread_attr_getstack(&attr, &start, &th->machine_stack_maxsize)); | ||||
| # elif defined HAVE_PTHREAD_ATTR_GETSTACKSIZE && defined HAVE_PTHREAD_ATTR_GETSTACKADDR | ||||
| 	CHECK_ERR(pthread_attr_getstackaddr(&attr, &start)); | ||||
| 	CHECK_ERR(pthread_attr_getstacksize(&attr, &th->machine_stack_maxsize)); | ||||
| # endif | ||||
| 	th->machine_stack_start = start; | ||||
| 	size_t size; | ||||
| 
 | ||||
| 	if (get_stack(&start, &size) == 0) { | ||||
| 	    th->machine_stack_start = start; | ||||
| 	    th->machine_stack_maxsize = size; | ||||
| 	} | ||||
| #else | ||||
| 	rb_raise(rb_eNotImpError, "ruby engine can initialize only in the main thread"); | ||||
| #endif | ||||
|  |  | |||
|  | @ -12,6 +12,9 @@ | |||
| #define RUBY_THREAD_PTHREAD_H | ||||
| 
 | ||||
| #include <pthread.h> | ||||
| #ifdef HAVE_PTHREAD_NP_H | ||||
| #include <pthread_np.h> | ||||
| #endif | ||||
| typedef pthread_t rb_thread_id_t; | ||||
| typedef pthread_mutex_t rb_thread_lock_t; | ||||
| typedef pthread_cond_t rb_thread_cond_t; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 naruse
						naruse