[Win32utils-devel] [Fwd: Ruby Win32-Service]
phurley at gmail.com
Sun Jun 18 20:17:41 EDT 2006
On 6/18/06, Luis Lavena <luislavena at gmail.com> wrote:
> I faced the same issue of the guy pointed out.
> Calling the EventHash from other native thread (not the one where ruby
> interpreter is running) trash everything. Worse is that the
> interpreter is currently "looping" in service_main
Exactly, ok so I am not off my rocker :-)
> As I understand the idea of Patrick, we could emulate the threading of
> Service_Ctrl in a green thread, something that will not work quite
> right without us pulling status in a regular basis.
Since I am going to use this for work, I can spend some paid time
tomorrow following up. I went through the C extension docs and it
looks pretty easy to create a green thread attached to an actual C
function. So my plan is as follows:
1. Create a Win32 Semaphore and mutex, that mirrors a simple list of
events (e.g. param change, stop, pause, etc).
2. In ServiceCtrl when ever a ruby call back is required: I will lock
the mutex, place an item in the list, increment the semaphor and
release the mutex.
3. In a green thread I will be waiting on the semaphor -- I am not
sure if this will block ruby's green threads if it does I will have to
spin against the semaphor and a ruby sleep -- ugly, but very doable.
4. When events arrive in the list, I will make the call back into the
main class -- this will occur in the same system thread, but a
different "ruby thread".
The only thing I am unsure of is #3, If a Ruby thread blocks on a
Win32 object, I think it will hang ruby -- if anyone has any
experience with this I would love to hear it -- otherwise I may spend
some time looking through the Ruby source to see if there is an
internal to allow waiting without the spin.
More information about the win32utils-devel