[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cherokee
Subject:    [Cherokee] Patch to allow Cherokee to run as a Windows service
From:       Ross Smith II <cherokeespam () netebb ! com>
Date:       2007-06-28 18:50:15
Message-ID: 468402E7.6070501 () netebb ! com
[Download RAW message or body]

Alvaro,

Per your request at

<http://article.gmane.org/gmane.comp.web.cherokee.general/972/>

I am including a patch to revision 781 that will allow the Cherokee to
properly terminate when the cherokeeserv service wrapper is stopped. The
patch is also available here:

<http://www.smithii.com/files/cherokee-781-cherokeeserv-0.2.patch>

Per Brian Rosner's comments, I cleaned up and reformatted cherokeeserv
to match Cherokee's style. The update is available here:

<http://www.smithii.com/files/cherokeeserv-0.2.zip>

I would love to get these changes into Subversion. Let me know if
there is anything I can do to assist in this process.

Feedback is appreciated,

Ross



["cherokee-781-cherokeeserv-0.2.patch" (text/plain)]

diff -uwrN cherokee.orig/cherokee/macros.h cherokee/cherokee/macros.h
--- cherokee.orig/cherokee/macros.h	2007-06-13 16:03:21.374740000 -0700
+++ cherokee/cherokee/macros.h	2007-06-28 10:05:03.616000000 -0700
@@ -359,4 +359,10 @@
 # define SLASH '/'
 #endif
 
+#ifdef _WIN32
+# define SHUTDOWN_SIGNALED() cherokee_win32_shutdown_signaled()
+#else
+# define SHUTDOWN_SIGNALED() (0)
+#endif
+
 #endif /* CHEROKEE_MACROS_H */
diff -uwrN cherokee.orig/cherokee/server.c cherokee/cherokee/server.c
--- cherokee.orig/cherokee/server.c	2007-06-26 03:16:32.834700000 -0700
+++ cherokee/cherokee/server.c	2007-06-28 10:05:03.897250000 -0700
@@ -1295,6 +1295,10 @@
 	if (unlikely (srv->wanna_exit)) 
 		return ret_ok;
 	
+	if (SHUTDOWN_SIGNALED()) {
+		return ret_ok;
+	}
+
 	return ret_eagain;
 }
 
diff -uwrN cherokee.orig/cherokee/thread.c cherokee/cherokee/thread.c
--- cherokee.orig/cherokee/thread.c	2007-06-21 18:53:23.796368000 -0700
+++ cherokee/cherokee/thread.c	2007-06-28 10:06:23.069125000 -0700
@@ -583,6 +583,11 @@
 	cherokee_connection_t *conn;
 
 	list_for_each_safe (i, tmp, LIST(&thd->polling_list)) {
+		if (SHUTDOWN_SIGNALED()) {
+			thd->exit = true;
+			return ret_ok;
+		}
+
 		conn = CONN(i);
 
 		/* Has it been too much without any work?
@@ -646,6 +652,11 @@
 	/* Process active connections
 	 */
 	list_for_each_safe (i, tmp, LIST(&thd->active_list)) {
+		if (SHUTDOWN_SIGNALED()) {
+			thd->exit = true;
+			return ret_ok;
+		}
+
 		conn = CONN(i);
 
 		TRACE (ENTRIES, "thread (%p) processing conn (%p), phase %d\n", thd, conn, conn->phase);
@@ -1404,6 +1415,11 @@
 	cherokee_sockaddr_t    new_sa;
 	cherokee_connection_t *new_conn;
 
+ 	if (SHUTDOWN_SIGNALED()) {
+ 		thd->exit = true;
+ 		return 0;
+ 	}
+
 	/* Return if there're too many or no new connections
 	 */
 	if (thd->conns_num >= thd->conns_max)
diff -uwrN cherokee.781/cherokee/win32_misc.c cherokee/cherokee/win32_misc.c
--- cherokee.781/cherokee/win32_misc.c	2007-06-27 13:15:36.934576000 -0700
+++ cherokee/cherokee/win32_misc.c	2007-06-28 10:37:25.225375000 -0700
@@ -5,6 +5,7 @@
  * Authors:
  *      Alvaro Lopez Ortega <alvaro@alobbs.com>
  *      Gisle Vanem <giva@bgnett.no>
+ *      Ross Smith II <cherokee at smithii.com>
  *
  * Copyright (C) 2001-2007 Alvaro Lopez Ortega
  *
@@ -53,6 +54,22 @@
 # define _ctor
 #endif
 
+#define EXIT_EVENT_NAME "cherokee_exit_1"
+
+/* clear an object */
+#define CLEAR(x) memset(&(x), 0, sizeof(x))
+
+struct security_attributes
+{
+  SECURITY_ATTRIBUTES sa;
+  SECURITY_DESCRIPTOR sd;
+};
+
+/* bool definitions */
+#define bool int
+#define true 1
+#define false 0
+
 static int     win_trace = 0;
 static SOCKET  first_sock_num;
 static WSADATA wsa_data;
@@ -1017,3 +1034,45 @@
 	return re;
 }
 
+static bool
+init_security_attributes_allow_all (struct security_attributes *obj)
+{
+	CLEAR (*obj);
+
+	obj->sa.nLength = sizeof (SECURITY_ATTRIBUTES);
+	obj->sa.lpSecurityDescriptor = &obj->sd;
+	obj->sa.bInheritHandle = TRUE;
+	if (!InitializeSecurityDescriptor (&obj->sd, SECURITY_DESCRIPTOR_REVISION))
+		return false;
+	if (!SetSecurityDescriptorDacl (&obj->sd, TRUE, NULL, FALSE))
+		return false;
+	return true;
+}
+
+static HANDLE
+create_event (const char *name, bool allow_all, bool initial_state, bool manual_reset)
+{
+	if (allow_all)
+	{
+		struct security_attributes sa;
+		if (!init_security_attributes_allow_all (&sa))
+			return NULL;
+		return CreateEvent (&sa.sa, (BOOL)manual_reset, (BOOL)initial_state, name);
+	}
+	else
+		return CreateEvent (NULL, (BOOL)manual_reset, (BOOL)initial_state, name);
+}
+
+int
+cherokee_win32_shutdown_signaled()
+{
+	static HANDLE exit_event = NULL;
+
+	if (!exit_event) {
+		exit_event = create_event (EXIT_EVENT_NAME, true, false, false);
+		if (!exit_event)
+		  return 1;
+	}
+
+	return WaitForSingleObject (exit_event, (DWORD) 0) == WAIT_OBJECT_0;
+}
diff -uwrN cherokee.orig/cherokee/win32_misc.h cherokee/cherokee/win32_misc.h
--- cherokee.orig/cherokee/win32_misc.h	2007-01-10 07:28:59.819955000 -0800
+++ cherokee/cherokee/win32_misc.h	2007-06-28 10:05:04.037875000 -0700
@@ -4,6 +4,7 @@
  *
  * Authors:
  *      Alvaro Lopez Ortega <alvaro@alobbs.com>
+ *      Ross Smith II <cherokee at smithii.com>
  *
  * Copyright (C) 2001-2007 Alvaro Lopez Ortega
  *
@@ -41,5 +42,6 @@
 unsigned int  sleep               (unsigned int seconds);
 
 int           cherokee_win32_stat (const char *path, struct stat *buf);
+int           cherokee_win32_shutdown_signaled();
 
 #endif /* CHEROKEE_WIN32_MISC_H */


_______________________________________________
Cherokee mailing list
Cherokee@cherokee-project.com
http://cherokee-project.com/cgi-bin/mailman/listinfo/cherokee


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic