Hi.

Please find attached a series of patches for Solaris >= 10, based on 2.2.4 code.

These patches will not work for Solaris < 10 (and apr's ./configure is
patched to take that into account).

Thank you.

--Stefan

--
Stefan Teleman
KDE e.V.
[EMAIL PROTECTED]
--- srclib/apr/atomic/unix/apr_atomic.c.orig	2006-08-03 07:05:27.000000000 -0400
+++ srclib/apr/atomic/unix/apr_atomic.c	2007-03-13 23:29:16.356121000 -0400
@@ -1,9 +1,9 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
+/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
+ * applicable.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
  *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
@@ -22,19 +22,69 @@
 
 #include <stdlib.h>
 
-#if defined(__GNUC__) && defined(__STRICT_ANSI__) && !defined(USE_GENERIC_ATOMICS)
+#if defined(SOLARIS2) && ((SOLARIS2 + 0) >= 10)
+#include <atomic.h>
+#if defined(USE_GENERIC_ATOMICS)
+#undef USE_GENERIC_ATOMICS
+#endif
+
+static volatile apr_uint32_t solaris_atomic_cas32(volatile apr_uint32_t *mem,
+        apr_uint32_t with,
+        apr_uint32_t cmp)
+{
+    volatile uint32_t prev;
+    prev = atomic_cas_32(mem, cmp, with);
+    return (apr_uint32_t) prev;
+}
+
+static volatile apr_uint32_t solaris_atomic_add32(volatile apr_uint32_t *mem,
+        apr_uint32_t val)
+{
+    return (apr_uint32_t) atomic_add_32_nv(mem, (int32_t) val);
+}
+
+static volatile apr_uint32_t solaris_atomic_sub32(volatile apr_uint32_t *mem,
+        apr_uint32_t val)
+{
+    volatile uint32_t result;
+    volatile int32_t sub = (int32_t) -val;
+    result = atomic_add_32_nv(mem, sub);
+    return (apr_uint32_t) result;
+}
+
+static volatile int solaris_atomic_dec32(volatile apr_uint32_t *mem)
+{
+    volatile int32_t result;
+    result = (int32_t) atomic_dec_32_nv((volatile uint32_t *) mem);
+    result -= 1;
+    return (int) result;
+}
+
+static volatile apr_uint32_t solaris_atomic_swap32(volatile apr_uint32_t *mem, apr_uint32_t val)
+{
+    volatile uint32_t result;
+    result = atomic_swap_32((uint32_t *) mem, (uint32_t *) val);
+    return (apr_uint32_t) result;
+}
+
+#endif /* SOLARIS */
+
+#if defined(__GNUC__) && defined(__STRICT_ANSI__) && !defined(USE_GENERIC_ATOMICS) && !defined(SOLARIS10)
 /* force use of generic atomics if building e.g. with -std=c89, which
  * doesn't allow inline asm */
 #define USE_GENERIC_ATOMICS
 #endif
 
-#if (defined(__i386__) || defined(__x86_64__)) \
-    && defined(__GNUC__) && !defined(USE_GENERIC_ATOMICS)
+#if (defined(__i386__) || defined(__i386) || defined (__amd64) || defined(__x86_64__) || defined (__sparc) || defined (__sparcv9)) \
+    && !defined(USE_GENERIC_ATOMICS) && defined(SOLARIS2)
 
 APR_DECLARE(apr_uint32_t) apr_atomic_cas32(volatile apr_uint32_t *mem, 
                                            apr_uint32_t with,
                                            apr_uint32_t cmp)
 {
+#if defined(SOLARIS2) && ((SOLARIS2 + 0) >= 10)
+    return solaris_atomic_cas32(mem, with, cmp);
+#else
     apr_uint32_t prev;
 
     asm volatile ("lock; cmpxchgl %1, %2"             
@@ -42,17 +92,23 @@
                   : "r" (with), "m" (*(mem)), "0"(cmp) 
                   : "memory", "cc");
     return prev;
+#endif
 }
 #define APR_OVERRIDE_ATOMIC_CAS32
 
 static apr_uint32_t inline intel_atomic_add32(volatile apr_uint32_t *mem, 
                                               apr_uint32_t val)
 {
+#if defined(SOLARIS2) && ((SOLARIS2 + 0) >= 10)
+    return solaris_atomic_add32(mem, val);
+#else
+
     asm volatile ("lock; xaddl %0,%1"
                   : "=r"(val), "=m"(*mem) /* outputs */
                   : "0"(val), "m"(*mem)   /* inputs */
                   : "memory", "cc");
     return val;
+#endif
 }
 
 APR_DECLARE(apr_uint32_t) apr_atomic_add32(volatile apr_uint32_t *mem, 
@@ -64,15 +120,22 @@
 
 APR_DECLARE(void) apr_atomic_sub32(volatile apr_uint32_t *mem, apr_uint32_t val)
 {
+#if defined(SOLARIS2) && ((SOLARIS2 + 0) >= 10)
+    solaris_atomic_sub32(mem, val);
+#else
     asm volatile ("lock; subl %1, %0"
                   :
                   : "m" (*(mem)), "r" (val)
                   : "memory", "cc");
+#endif
 }
 #define APR_OVERRIDE_ATOMIC_SUB32
 
 APR_DECLARE(int) apr_atomic_dec32(volatile apr_uint32_t *mem)
 {
+#if defined(SOLARIS2) && ((SOLARIS2 + 0) >= 10)
+    return solaris_atomic_dec32(mem);
+#else
     unsigned char prev;
 
     asm volatile ("lock; decl %1;\n\t"
@@ -81,6 +144,7 @@
                   : "m" (*(mem))
                   : "memory", "cc");
     return prev;
+#endif
 }
 #define APR_OVERRIDE_ATOMIC_DEC32
 
@@ -98,6 +162,9 @@
 
 APR_DECLARE(apr_uint32_t) apr_atomic_xchg32(volatile apr_uint32_t *mem, apr_uint32_t val)
 {
+#if defined(SOLARIS2) && ((SOLARIS2 + 0) >= 10)
+    return solaris_atomic_swap32(mem, val);
+#else
     apr_uint32_t prev = val;
 
     asm volatile ("lock; xchgl %0, %1"
@@ -105,12 +172,13 @@
                   : "m" (*(mem)), "0"(prev)
                   : "memory");
     return prev;
+#endif
 }
 #define APR_OVERRIDE_ATOMIC_XCHG32
 
 /*#define apr_atomic_init(pool)        APR_SUCCESS*/
 
-#endif /* (__linux__ || __EMX__ || __FreeBSD__) && __i386__ */
+#endif /* (__linux__ || __EMX__ || __FreeBSD__ || __sun) */
 
 #if (defined(__PPC__) || defined(__ppc__)) && defined(__GNUC__) \
     && !defined(USE_GENERIC_ATOMICS)
--- srclib/apr/build/apr_hints.m4.orig	Thu Aug  3 04:05:27 2006
+++ srclib/apr/build/apr_hints.m4	Tue Mar 20 16:31:54 2007
@@ -234,8 +234,13 @@
 	;;
     *-solaris2*)
     	PLATOSVERS=`echo $host | sed 's/^.*solaris2.//'`
+	if [ $PLATOSVERS -ge 10 ] ; then
 	APR_ADDTO(CPPFLAGS, [-DSOLARIS2=$PLATOSVERS -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT])
+        	APR_SETIFNULL(apr_lock_method, [USE_SYSVSEM_SERIALIZE])
+	else
+		APR_ADDTO(CPPFLAGS, [-DSOLARIS2=$PLATOSVERS -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT])
         APR_SETIFNULL(apr_lock_method, [USE_FCNTL_SERIALIZE])
+	endif
 	;;
     *-sunos4*)
 	APR_ADDTO(CPPFLAGS, [-DSUNOS4])
--- srclib/apr/configure.orig	Fri Jan  5 22:39:14 2007
+++ srclib/apr/configure	Tue Mar 20 16:27:57 2007
@@ -4931,9 +4931,14 @@
 
 
   if test -z "$apr_lock_method"; then
+    if [ $PLATOSVERS -ge 10 ] ; then
+        test "x$silent" != "xyes" && echo "  setting apr_lock_method to \"USE_SYSVSEM_SERIALIZE\""
+        apr_lock_method="USE_SYSVSEM_SERIALIZE"
+    else
     test "x$silent" != "xyes" && echo "  setting apr_lock_method to \"USE_FCNTL_SERIALIZE\""
     apr_lock_method="USE_FCNTL_SERIALIZE"
   fi
+  fi
 
 	;;
     *-sunos4*)
--- server/mpm_common.c.orig	2006-09-15 09:19:25.000000000 -0400
+++ server/mpm_common.c	2007-03-13 23:30:40.194531000 -0400
@@ -1186,16 +1186,22 @@
 apr_status_t ap_fatal_signal_setup(server_rec *s, apr_pool_t *in_pconf)
 {
 #ifndef NO_USE_SIGACTION
-    struct sigaction sa;
+    struct sigaction sa;
 
     sigemptyset(&sa.sa_mask);
+    sa.sa_flags = 0;
+
+#if defined(SA_RESTART)
+    sa.sa_flags |= SA_RESTART;
+#endif
+#if defined(SA_INTERRUPT)
+    sa.sa_flags |= SA_INTERRUPT;
+#endif
 
 #if defined(SA_ONESHOT)
-    sa.sa_flags = SA_ONESHOT;
+    sa.sa_flags |= SA_ONESHOT;
 #elif defined(SA_RESETHAND)
-    sa.sa_flags = SA_RESETHAND;
-#else
-    sa.sa_flags = 0;
+    sa.sa_flags |= SA_RESETHAND;
 #endif
 
     sa.sa_handler = sig_coredump;
--- srclib/apr/threadproc/unix/signals.c.orig	2006-08-03 07:05:27.000000000 -0400
+++ srclib/apr/threadproc/unix/signals.c	2007-03-13 23:29:47.826964000 -0400
@@ -73,7 +73,7 @@
  */
 APR_DECLARE(apr_sigfunc_t *) apr_signal(int signo, apr_sigfunc_t * func)
 {
-    struct sigaction act, oact;
+    struct sigaction act, oact;
 
     act.sa_handler = func;
     sigemptyset(&act.sa_mask);
@@ -81,6 +81,9 @@
 #ifdef SA_INTERRUPT             /* SunOS */
     act.sa_flags |= SA_INTERRUPT;
 #endif
+#ifdef SA_RESTART
+    act.sa_flags |= SA_RESTART;
+#endif
 #if defined(__osf__) && defined(__alpha)
     /* XXX jeff thinks this should be enabled whenever SA_NOCLDWAIT is defined */
 
--- server/mpm/worker/worker.c.orig	2006-09-15 09:19:25.000000000 -0400
+++ server/mpm/worker/worker.c	2007-03-13 23:30:10.917395000 -0400
@@ -426,7 +426,7 @@
 static void set_signals(void)
 {
 #ifndef NO_USE_SIGACTION
-    struct sigaction sa;
+    struct sigaction sa;
 #endif
 
     if (!one_process) {
@@ -437,6 +437,14 @@
     sigemptyset(&sa.sa_mask);
     sa.sa_flags = 0;
 
+#ifdef SA_RESTART
+    sa.sa_flags |= SA_RESTART;
+#endif
+
+#ifdef SA_INTERRUPT
+    sa.sa_flags |= SA_INTERRUPT;
+#endif
+
     sa.sa_handler = sig_term;
     if (sigaction(SIGTERM, &sa, NULL) < 0)
         ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf,

Reply via email to