From: Robert Klemme Date: 2012-02-15T01:08:57+09:00 Subject: Re: Why GIL is not released on ruby/dl external function call. On Tue, Feb 14, 2012 at 2:11 PM, Grigory Petrov wrote: > Hello. > > if i run following test code: > > require 'dl/import' > module User32 >  extend DL::Importer >  dlload 'user32' >  extern 'int MessageBoxA(int, char*, char*, int)' > end > Thread.new { User32.MessageBoxA( 0, "Text", "Caption", 0 ) } > loop { sleep 1; puts( "loop running" ) } > > I will see no "loop running" messages while message box is visible. So > i can suggest that Ruby is not releasing GIL while calling external > function via Ruby\dl. Why such weird architectural decision? This > prevents me from calling blocking functions in background thread :(. Since Ruby does not know what your external C function does (it could manipulate Ruby objects!) it takes a conservative approach and locks. Cheers robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/