Explorar o código

Fix compilation on OSX 10.3.

On this OSX version, there is a stub mlockall() function
that doesn't work, *and* the declaration for it is hidden by
an '#ifdef _P1003_1B_VISIBLE'.  This would make autoconf
successfully find the function, but our code fail to build
when no declaration was found.

This patch adds an additional test for the declaration.
Nick Mathewson %!s(int64=14) %!d(string=hai) anos
pai
achega
444eff6286
Modificáronse 3 ficheiros con 14 adicións e 8 borrados
  1. 4 0
      ChangeLog
  2. 7 2
      configure.in
  3. 3 6
      src/common/compat.c

+ 4 - 0
ChangeLog

@@ -1,3 +1,7 @@
+Changes in version 0.2.2.7-alpha - 2009-??-??
+  o Minor bugfixes:
+    - Fix compilation on OSX 10.3, which has a stub mlockall() but hides it.
+
 Changes in version 0.2.2.6-alpha - 2009-11-19
   o Major features:
     - Directory authorities can now create, vote on, and serve multiple

+ 7 - 2
configure.in

@@ -629,9 +629,14 @@ if test x$tcmalloc = xyes ; then
 fi
 
 # By default, we're going to assume we don't have mlockall()
-# bionic and other platforms have various broken mlockall subsystems
-# some of systems don't have a working mlockall, some aren't linkable
+# bionic and other platforms have various broken mlockall subsystems.
+# Some systems don't have a working mlockall, some aren't linkable,
+# and some have it but don't declare it.
 AC_CHECK_FUNCS(mlockall)
+AC_CHECK_DECLS([mlockall], , , [
+#ifdef HAVE_SYS_MMAN_H
+#include <sys/mman.h>
+#endif])
 
 # Allow user to specify an alternate syslog facility
 AC_ARG_WITH(syslog-facility,

+ 3 - 6
src/common/compat.c

@@ -2258,7 +2258,6 @@ int
 tor_mlockall(void)
 {
   static int memory_lock_attempted = 0;
-  int ret;
 
   if (memory_lock_attempted) {
     return 1;
@@ -2273,15 +2272,13 @@ tor_mlockall(void)
    * http://msdn.microsoft.com/en-us/library/aa366895(VS.85).aspx
    */
 
-#ifdef HAVE_MLOCKALL
-  ret = tor_set_max_memlock();
-  if (ret == 0) {
+#if defined(HAVE_MLOCKALL) && HAVE_DECL_MLOCKALL
+  if (tor_set_max_memlock() == 0) {
     /* Perhaps we only want to log this if we're in a verbose mode? */
     log_notice(LD_GENERAL, "RLIMIT_MEMLOCK is now set to RLIM_INFINITY.");
   }
 
-  ret = mlockall(MCL_CURRENT|MCL_FUTURE);
-  if (ret == 0) {
+  if (mlockall(MCL_CURRENT|MCL_FUTURE) == 0) {
     log_notice(LD_GENERAL, "Insecure OS paging is effectively disabled.");
     return 0;
   } else {