www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Integrate vibe.d into Windows Service

reply Andre Pany <andre s-e-a-p.de> writes:
Hi,

I translated the CPP example of a windows service to D.
https://docs.microsoft.com/en-us/windows/desktop/Services/svc-cpp

I wonder how can I integrate a vibe.d http server here:

__gshared HANDLE ghSvcStopEvent = NULL;

VOID SvcInit(DWORD dwArgc, LPTSTR* lpszArgv)
{
     ghSvcStopEvent = CreateEvent(NULL, // default security 
attributes
             TRUE, // manual reset event
             FALSE, // not signaled
             NULL); // no name

     if (ghSvcStopEvent == NULL)
     {
         ReportSvcStatus(SERVICE_STOPPED, NO_ERROR, 0);
         return;
     }

     ReportSvcStatus(SERVICE_RUNNING, NO_ERROR, 0);

     // TO_DO: Perform work until service stops.
	
     while (1)
     {
         WaitForSingleObject(ghSvcStopEvent, INFINITE);
         ReportSvcStatus(SERVICE_STOPPED, NO_ERROR, 0);
         return;
     }
}

WaitForSingleObject will wait forever until ghSvcStopEvent will 
be filled
(by extern (Windows) VOID SvcCtrlHandler(DWORD dwCtrl) nothrow).

Do you have any proposal how to integrate vibe.d here?

Kind regards
André
Nov 21 2018
next sibling parent reply Kagamin <spam here.lot> writes:
Start vibe in another thread and return from ServiceMain, see 
https://docs.microsoft.com/en-us/windows/desktop/Services/service-
ervicemain-function also ideally you should report running state only after
vibe initialized, opened sockets and started listening, before that it's not
really running.
Nov 21 2018
next sibling parent Andre Pany <andre s-e-a-p.de> writes:
On Wednesday, 21 November 2018 at 15:05:31 UTC, Kagamin wrote:
 Start vibe in another thread and return from ServiceMain, see 
 https://docs.microsoft.com/en-us/windows/desktop/Services/service-
ervicemain-function also ideally you should report running state only after
vibe initialized, opened sockets and started listening, before that it's not
really running.
Thanks a lot. I will try. Kind regards Andre
Nov 21 2018
prev sibling parent reply Andre Pany <andre s-e-a-p.de> writes:
On Wednesday, 21 November 2018 at 15:05:31 UTC, Kagamin wrote:
 Start vibe in another thread and return from ServiceMain, see 
 https://docs.microsoft.com/en-us/windows/desktop/Services/service-
ervicemain-function also ideally you should report running state only after
vibe initialized, opened sockets and started listening, before that it's not
really running.
I tried to wrap WaitForSingleObject into a Fiber by using command runTask. In theory it should work fine but the service (app) just crash without any information on an empty runTask function. Also calling listenHTTP crashes the service. Here I am able to catch the Error "eventcore.core static constructor didn't run!?". I created a github issue with complete source code here https://github.com/vibe-d/vibe-core/issues/105 Kind regards Andre
Nov 23 2018
parent reply Kagamin <spam here.lot> writes:
You don't need to initialize runtime because it's initialized by 
standard D startup code, but you need to attach threads that are 
not created by D or static constructors won't be run and only 
C-level code would work there.
Nov 23 2018
parent reply Andre Pany <andre s-e-a-p.de> writes:
On Friday, 23 November 2018 at 21:27:26 UTC, Kagamin wrote:
 You don't need to initialize runtime because it's initialized 
 by standard D startup code, but you need to attach threads that 
 are not created by D or static constructors won't be run and 
 only C-level code would work there.
Thank you, I wasn't aware of this. For references, I found this post which explains thread_attachThis. I assume you meant this function. Kind regards Andre
Nov 23 2018
parent Andre Pany <andre s-e-a-p.de> writes:
On Friday, 23 November 2018 at 21:35:57 UTC, Andre Pany wrote:
 On Friday, 23 November 2018 at 21:27:26 UTC, Kagamin wrote:
 You don't need to initialize runtime because it's initialized 
 by standard D startup code, but you need to attach threads 
 that are not created by D or static constructors won't be run 
 and only C-level code would work there.
Thank you, I wasn't aware of this. For references, I found this post which explains thread_attachThis. I assume you meant this function. Kind regards Andre
Post explaining thread_attachThis https://forum.dlang.org/thread/ounui4$171a$1 digitalmars.com
Nov 23 2018
prev sibling parent Daniel Kozak <kozzi11 gmail.com> writes:
On Wednesday, 21 November 2018 at 09:59:19 UTC, Andre Pany wrote:
 Hi,

 I translated the CPP example of a windows service to D.
 https://docs.microsoft.com/en-us/windows/desktop/Services/svc-cpp

 [...]
Today I needed this too, and after some searching I came across this package which works ok for me with vibed: https://code.dlang.org/packages/daemonize
Nov 27 2018