NTTレゾナントã®ä¸‰æµ¦ã§ã™ã€‚
Bug #1872 [ruby-dev:38996]ã®å¯¾ç–ã‚’ã—ã¦ã¿ã¾ã—ãŸã€‚
â– å•é¡Œã®å¾©ç¿’
–enable-pthread版ã§ruby -e 'Process.fork{p system(“ls”)}'ã¨ã‹ã™ã‚‹ã¨
fork(2)ã®å¾Œã§å›ºã¾ã‚‹ã“ã¨ãŒã‚る。
■解æžçµæžœ
・fork()ã§ã§ããŸæ–°ã—ã„プãƒã‚»ã‚¹ã®ä¸ã«ã¯main thread以外ã®threadã¯å˜åœ¨ã—
ãªã„。当然ã€SIGVTALRMã—ã¦ãれるthreadã‚‚ã„ãªã„。
・該threadã®åˆ¶å¾¡ã«safe_mutex_lock()を使ã†ã€‚safe_mutex_lock()ã®safeãŸã‚‹
所以ã¯ã€lockã‚’ä¿æŒã—ã¦ã„ã‚‹threadãŒçµ‚了ã™ã‚‹æ™‚ã«lockを解放ã™ã‚‹ã‹ã‚‰ã€‚ã
ã®ãŸã‚ã«pthread_cleanup_push()を使ã†ã€‚
・fork()ã®æ™‚ã«ã¯è©²threadãŒçµ‚了ã—ã¦ã¯ã„ãªã„ãŸã‚ã€lock解放æ“作ã¯è¡Œã‚ã‚Œãª
ã„。
・fork()直後ã«rb_thread_stop_timer()ãŒå‘¼ã³å‡ºã•ã‚Œã€è©²lockã‚’æ“作ã—よã†ã¨
ã—ã¦åˆºã•ã‚‹ã“ã¨ãŒã‚る†。
–
†pthread_mutex_tã¨pthread_mutex_lock()ã®å®Ÿç¾ã«ä¾å˜ã™ã‚‹ã€‚刺ã•ã‚‰ãªã„ç’°
境もã‚ã‚‹ã‹ã‚‚。三浦ãŒä½¿ã£ãŸç’°å¢ƒã§ã¯pthread_mutex_trylock()ã§ã‚‚刺ã•ã‚‹ã€‚
■対ç–
・fork()直後ã«è©²ãƒ‡ãƒ¼ã‚¿ã‚’åˆæœŸåŒ–ã™ã‚‹ã€‚fork()直後ãªã®ã§èª¿ã¹ãªãã¦ã‚‚ãã†ã„
ã†threadã¯ã„ãªã„。
ruby-1.8.7-p248ã ã¨ã“ã†ã„ã†patchã§ã„ã„ã¨æ€ã„ã¾ã™ã€‚関数å以外ã¯ã€‚
一晩動ã‹ã—ã¦ã‚‚刺ã•ã‚‰ãªããªã‚Šã¾ã—ãŸã€‚