Author: joergr
Date: 2005-04-08 17:50:09 -0400 (Fri, 08 Apr 2005)
New Revision: 42712
Modified:
trunk/mcs/tools/mono-service/ChangeLog
trunk/mcs/tools/mono-service/mono-service.cs
Log:
2005-04-08 Joerg Rosenkranz <[EMAIL PROTECTED]>
* mono-service.cs: Restructured code to run service main loop
in callback called by ServiceBase.Run. This matches Windows
service behaviour better.
Modified: trunk/mcs/tools/mono-service/ChangeLog
===================================================================
--- trunk/mcs/tools/mono-service/ChangeLog 2005-04-08 21:48:26 UTC (rev
42711)
+++ trunk/mcs/tools/mono-service/ChangeLog 2005-04-08 21:50:09 UTC (rev
42712)
@@ -1,3 +1,9 @@
+2005-04-08 Joerg Rosenkranz <[EMAIL PROTECTED]>
+
+ * mono-service.cs: Restructured code to run service main loop
+ in callback called by ServiceBase.Run. This matches Windows
+ service behaviour better.
+
2005-04-07 Zoltan Varga <[EMAIL PROTECTED]>
* mono-service.cs: Fix compilation with csc.
@@ -2,3 +8,3 @@
-2004-04-06 Joerg Rosenkranz <[EMAIL PROTECTED]>
+2005-04-06 Joerg Rosenkranz <[EMAIL PROTECTED]>
Modified: trunk/mcs/tools/mono-service/mono-service.cs
===================================================================
--- trunk/mcs/tools/mono-service/mono-service.cs 2005-04-08 21:48:26 UTC
(rev 42711)
+++ trunk/mcs/tools/mono-service/mono-service.cs 2005-04-08 21:50:09 UTC
(rev 42712)
@@ -18,6 +18,7 @@
class MonoServiceRunner {
static string assembly, directory, lockfile, name, logname;
+ static ServiceBase service = null;
static void info (string format, params object [] args)
{
@@ -120,6 +121,22 @@
Syscall.write (lfp, buf, (ulong)pid.Length);
Marshal.FreeCoTaskMem (buf);
+ //
+ // Setup signals
+ //
+ signal_event = new AutoResetEvent (false);
+
+ // Invoke all the code used in the signal handler, so the JIT
does
+ // not kick-in inside the signal handler
+ signal_event.Set ();
+ signal_event.Reset ();
+
+ // Hook up
+ signal (UnixConvert.FromSignum (Signum.SIGTERM), new
sighandler_t (my_handler));
+ signal (UnixConvert.FromSignum (Signum.SIGUSR1), new
sighandler_t (my_handler));
+ signal (UnixConvert.FromSignum (Signum.SIGUSR2), new
sighandler_t (my_handler));
+
+ // Load service assembly
Assembly a = null;
try {
@@ -137,6 +154,16 @@
return 1;
}
+ // Hook up RunService callback
+ FieldInfo fi = typeof (ServiceBase).GetField ("RunService",
BindingFlags.Static | BindingFlags.NonPublic);
+ if (fi == null){
+ error ("Internal Mono Error: Could not find RunService
in ServiceBase");
+ return 1;
+ }
+ fi.SetValue (null, new EventHandler (RunService));
+
+ // And run its Main. Our RunService handler is invoked from
+ // ServiceBase.Run.
MethodInfo entry = a.EntryPoint;
if (entry == null){
error ("Entry point not defined in service");
@@ -146,36 +173,26 @@
string [] service_args = new string [0];
entry.Invoke (null, service_args);
+ return 0;
+ }
+
+ // The main service loop
+ private static void RunService (object o, EventArgs e)
+ {
FieldInfo fi = typeof (ServiceBase).GetField
("RegisteredServices", BindingFlags.Static | BindingFlags.NonPublic);
if (fi == null){
error ("Internal Mono Error: Could not find
RegisteredServices in ServiceBase");
- return 1;
+ return;
}
ServiceBase [] services = (ServiceBase []) fi.GetValue (null);
if (services == null || services.Length == 0){
error ("No services were registered by this service");
- return 1;
+ return;
}
-
- //
- // Setup signals
- //
- signal_event = new AutoResetEvent (false);
-
- // Invoke all the code used in the signal handler, so the JIT
does
- // not kick-in inside the signal handler
- signal_event.Set ();
- signal_event.Reset ();
-
- // Hook up
- signal (UnixConvert.FromSignum (Signum.SIGTERM), new
sighandler_t (my_handler));
- signal (UnixConvert.FromSignum (Signum.SIGUSR1), new
sighandler_t (my_handler));
- signal (UnixConvert.FromSignum (Signum.SIGUSR2), new
sighandler_t (my_handler));
-
+
// Start up the service.
-
- ServiceBase service = null;
+ service = null;
if (name != null){
foreach (ServiceBase svc in services){
@@ -222,10 +239,9 @@
}
}
+ // Clean up
foreach (ServiceBase svc in services){
svc.Dispose ();
}
-
- return 0;
}
}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches