dgaudet 98/07/20 09:37:15
Modified: src CHANGES
src/include ap_config.h
src/main http_main.c
Log:
serialized accepts for OS/2
Submitted by: Brian Havard
Revision Changes Path
1.972 +2 -0 apache-1.3/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/CHANGES,v
retrieving revision 1.971
retrieving revision 1.972
diff -u -r1.971 -r1.972
--- CHANGES 1998/07/20 16:33:56 1.971
+++ CHANGES 1998/07/20 16:37:05 1.972
@@ -1,4 +1,6 @@
Changes with Apache 1.3.2
+
+ *) PORT: implement serialized accepts for OS/2. [Brian Havard]
*) mod_include had problems with the fsize and flastmod directives
under WIN32. Fix also avoids the minor security hole of using
1.228 +1 -0 apache-1.3/src/include/ap_config.h
Index: ap_config.h
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/include/ap_config.h,v
retrieving revision 1.227
retrieving revision 1.228
diff -u -r1.227 -r1.228
--- ap_config.h 1998/07/18 15:30:43 1.227
+++ ap_config.h 1998/07/20 16:37:09 1.228
@@ -671,6 +671,7 @@
#define MAXSOCKETS 4096
#define USE_OS2_SCOREBOARD
#define NO_RELIABLE_PIPED_LOGS
+#define USE_OS2SEM_SERIALIZED_ACCEPT
#elif defined(__MACHTEN__)
typedef int rlim_t;
1.375 +64 -0 apache-1.3/src/main/http_main.c
Index: http_main.c
===================================================================
RCS file: /export/home/cvs/apache-1.3/src/main/http_main.c,v
retrieving revision 1.374
retrieving revision 1.375
diff -u -r1.374 -r1.375
--- http_main.c 1998/07/14 09:57:56 1.374
+++ http_main.c 1998/07/20 16:37:11 1.375
@@ -190,6 +190,7 @@
/* Add MMAP style functionality to OS/2 */
#define INCL_DOSMEMMGR
#define INCL_DOSEXCEPTIONS
+#define INCL_DOSSEMAPHORES
#include <os2.h>
#include <umalloc.h>
#include <stdio.h>
@@ -834,6 +835,69 @@
if (flock(lock_fd, LOCK_UN) < 0) {
ap_log_error(APLOG_MARK, APLOG_EMERG, server_conf,
"flock: LOCK_UN: Error freeing accept lock. Exiting!");
+ clean_child_exit(APEXIT_CHILDFATAL);
+ }
+}
+
+#elif defined(USE_OS2SEM_SERIALIZED_ACCEPT)
+
+static HMTX lock_sem = -1;
+
+static void accept_mutex_cleanup(void *foo)
+{
+ DosCloseMutexSem(lock_sem);
+}
+
+/*
+ * Initialize mutex lock.
+ * Done by each child at it's birth
+ */
+static void accept_mutex_child_init(pool *p)
+{
+ int rc = DosOpenMutexSem(NULL, &lock_sem);
+
+ if (rc != 0) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, server_conf,
+ "Child cannot open lock semaphore");
+ clean_child_exit(APEXIT_CHILDINIT);
+ }
+}
+
+/*
+ * Initialize mutex lock.
+ * Must be safe to call this on a restart.
+ */
+static void accept_mutex_init(pool *p)
+{
+ int rc = DosCreateMutexSem(NULL, &lock_sem, DC_SEM_SHARED, FALSE);
+
+ if (rc != 0) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, server_conf,
+ "Parent cannot create lock semaphore");
+ exit(APEXIT_INIT);
+ }
+
+ ap_register_cleanup(p, NULL, accept_mutex_cleanup, ap_null_cleanup);
+}
+
+static void accept_mutex_on(void)
+{
+ int rc = DosRequestMutexSem(lock_sem, SEM_INDEFINITE_WAIT);
+
+ if (rc != 0) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, server_conf,
+ "OS2SEM: Error %d getting accept lock. Exiting!", rc);
+ clean_child_exit(APEXIT_CHILDFATAL);
+ }
+}
+
+static void accept_mutex_off(void)
+{
+ int rc = DosReleaseMutexSem(lock_sem);
+
+ if (rc != 0) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, server_conf,
+ "OS2SEM: Error %d freeing accept lock. Exiting!", rc);
clean_child_exit(APEXIT_CHILDFATAL);
}
}