On Jun 30, 2010, at 8:07 PM, MacRuby wrote:

> #768: Timeout is broken. It seems MacRuby does not dispatch the Thread.
> ----------------------------------+-----------------------------------------
> Reporter:  watson1...@…          |        Owner:  lsansone...@…        
>     Type:  defect                |       Status:  closed               
> Priority:  blocker               |    Milestone:                       
> Component:  MacRuby               |   Resolution:  duplicate            
> Keywords:                        |  
> ----------------------------------+-----------------------------------------
> Changes (by martinlagarde...@…):
> 
>  * status:  new => closed
>  * resolution:  => duplicate
> 
> 
> Comment:
> 
> This is a duplicate of a know bug: #176
> 
> The problem is not that the thread is not dispatched. It is actually
> dispatched. But the dispatched thread is not the one that does the
> operation, it's a thread that sleep for whatever was passed to timeout,
> and then sends "cancel" to the main thread. However, with the way MacRuby
> implements threads (with pthread), it's not possible to cancel the main
> thread without breaking everything :D.
> 
> We're working on it, and waiting to find a solution.

I believe the rubinius guys solved this using the following trick. I may also 
be completely wrong about it. :)

When you create a timeout thread, also create a named socket (or pipe) and add 
its file descriptor to the set of descriptors that the main loop selects/polls 
on. Have your timeout thread wake and signal that file descriptor. The main 
loop will detect the signal on that descriptor and do the appropriate thing.

That's also a technique for having signal handlers cleanly terminate the 
process. They can signal another FD which causes the main loop to clean up 
after itself and shutdown nicely.

cr

_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

Reply via email to