#794: `pthread_mutex_unlock(&t->sleep_mutex)' failed: Invalid argument (22) ----------------------------------+----------------------------------------- Reporter: watson1...@… | Owner: lsansone...@… Type: defect | Status: new Priority: blocker | Milestone: Component: MacRuby | Keywords: ----------------------------------+-----------------------------------------
Comment(by watson1...@…): An error occurs when pthread_mutex_destroy() is executed in RoxorCore::unregister_thread() right before MacRuby execute pthread_mutex_lock() in rb_vm_thread_cancel().[[BR]] So, I guess that should not use pthread_assert() in rb_vm_thread_cancel(). I do not yet understand why MacRuby do such a operation. {{{ #!diff diff --git a/vm.cpp b/vm.cpp index 60e6db4..649f6d3 100644 --- a/vm.cpp +++ b/vm.cpp @@ -4580,7 +4580,10 @@ rb_vm_thread_cancel(rb_vm_thread_t *t) rb_vm_thread_throw_kill(); } else { - pthread_assert(pthread_mutex_lock(&t->sleep_mutex)); + int code = pthread_mutex_lock(&t->sleep_mutex); + if(code == EINVAL) { + return; + } if (t->in_cond_wait) { // We are trying to kill a thread which is currently waiting // for a condition variable (#sleep). Instead of canceling the @@ -4588,12 +4591,12 @@ rb_vm_thread_cancel(rb_vm_thread_t *t) // will autodestroy itself, to work around a stack unwinding // bug in the Mac OS X pthread implementation that messes our // C++ exception handlers. - pthread_assert(pthread_cond_signal(&t->sleep_cond)); + pthread_cond_signal(&t->sleep_cond); } else { - pthread_assert(pthread_cancel(t->thread)); + pthread_cancel(t->thread); } - pthread_assert(pthread_mutex_unlock(&t->sleep_mutex)); + pthread_mutex_unlock(&t->sleep_mutex); } } } }}} -- Ticket URL: <http://www.macruby.org/trac/ticket/794#comment:4> MacRuby <http://macruby.org/> _______________________________________________ MacRuby-devel mailing list MacRuby-devel@lists.macosforge.org http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel