[Win32utils-devel] win32-daemon 0.6.1 problem

Berger, Daniel Daniel.Berger at qwest.com
Mon Nov 3 11:23:15 EST 2008


Hi, 

> -----Original Message-----
> From: win32utils-devel-bounces at rubyforge.org 
> [mailto:win32utils-devel-bounces at rubyforge.org] On Behalf Of 
> Heesob Park
> Sent: Sunday, November 02, 2008 8:52 AM
> To: Development and ideas for win32utils projects
> Subject: Re: [Win32utils-devel] win32-daemon 0.6.1 problem
> 
> Hi,
> 
> 2008/11/1 Berger, Daniel <Daniel.Berger at qwest.com>:
> >
> > Anyway, still no luck with running the Daemon itself. Now 
> that we have 
> > callbacks working better in win32-api, I'm hoping to 
> revisit the pure 
> > Ruby Win32::Daemon class again. :)
> >
> I struggled with the callback and service control whole 
> weekend :) I made the pure Ruby Win32::Daemon class as you expected.
> Here are two patches and two ruby code.

Oh, excellent!
 
> First patch is trivial for callback support.
> Second patch is a little messy. I added address attribute to 
> callback class.
> 
> As you know, Win32 thread is not working well with Ruby.
> So I implemented pure Ruby version as two separate processes 
> without thread.
> The daemon.rb and daemon0.rb must be in the same folder.
> Some code cleanup and adding close handle code are required.
> I think the startup argument notification need to reform.
> I tried mmap and pipe but both failed with segment fault.
> 
> Patch for windows-pr/lib/windows/service.rb
> --- service.rb.bak      2008-11-03 00:24:35.000000000 +0900
> +++ service.rb  2008-11-03 00:24:35.000000000 +0900
> @@ -128,7 +128,7 @@
>        API.new('QueryServiceLockStatus', 'LPLP', 'B', 'advapi32')
>        API.new('QueryServiceStatus', 'LP', 'B', 'advapi32')
>        API.new('QueryServiceStatusEx', 'LLPLP', 'B', 'advapi32')
> -      API.new('RegisterServiceCtrlHandler', 'PL', 'L', 'advapi32')
> +      API.new('RegisterServiceCtrlHandler', 'PK', 'L', 'advapi32')
>        API.new('RegisterServiceCtrlHandlerEx', 'PPP', 'L', 'advapi32')
>        API.new('SetServiceBits', 'LLII', 'B', 'advapi32')
>        API.new('SetServiceStatus', 'LP', 'B', 'advapi32')

Ok, I've updated both RegisterServiceCtrlHandler and
RegisterServiceCtrlHandlerEx in CVS. That update will be part of the
0.9.6 release of windows-pr.
  
> Patch for win32-api/ext/win32/api.c
> --- api.c.old   2008-11-03 00:25:46.000000000 +0900
> +++ api.c       2008-11-03 00:25:05.000000000 +0900
> @@ -12,6 +12,7 @@
>  #define _T_STRING   5
> 
>  VALUE cAPIError, cCallbackError;
> +static VALUE ActiveCallback = Qnil;
> 
>  typedef struct {
>      HANDLE library;
> @@ -109,6 +110,7 @@
>   */
>  static VALUE callback_init(int argc, VALUE* argv, VALUE self)  {
> +   extern void *CallbackTable[];
>     VALUE v_proto, v_return, v_proc;
>     int i;
> 
> @@ -131,6 +133,8 @@
>     rb_iv_set(self, "@function", v_proc);
>     rb_iv_set(self, "@prototype", v_proto);
>     rb_iv_set(self, "@return_type", v_return);
> +   rb_iv_set(self, "@address", 
> ULONG2NUM((LPARAM)CallbackTable[RSTRING(v_proto)

Whoops. I think something got cut off here. What should that be?

> +   ActiveCallback = self;
> 
>     return self;
>  }
> @@ -473,7 +477,6 @@
>     DWORD params[16];
>  } CALLPARAM;
> 
> -static VALUE ActiveCallback;
> 
>  DWORD CallbackFunction(CALLPARAM param)  { @@ -811,6 +814,7 @@
>     rb_define_attr(cCallback, "return_type", 1, 0);
> 
>     /* The numeric address of the function pointer */
> +   rb_define_attr(cCallback, "address", 1, 0);
>     rb_define_attr(cFunction, "address", 1, 0);
> 
>    /* Constants */

<snip the pure Ruby stuff>

Looks good. It may be a little while before I can get back to it, since
I'm getting swamped at work.

Many thanks!

Dan

PS - Maybe it's time to revisit
http://rubyforge.org/tracker/index.php?func=detail&aid=16627&group_id=85
&atid=413, too.


This communication is the property of Qwest and may contain confidential or
privileged information. Unauthorized use of this communication is strictly 
prohibited and may be unlawful.  If you have received this communication 
in error, please immediately notify the sender by reply e-mail and destroy 
all copies of the communication and any attachments.


More information about the win32utils-devel mailing list