Author: sebor
Date: Mon Jan 18 01:21:27 2010
New Revision: 900262

URL: http://svn.apache.org/viewvc?rev=900262&view=rev
Log:
2010-01-17  John Taylor <jbt.oldem...@gmail.com>

        STDCXX-1045
        * etc/config/src/POSIX_MADVISE.cpp: New config test.
        * src/memattr.cpp [_RWSTD_OS_SUNOS && !_RWSTD_NO_POSIX_MADVISE]
        (__rw_memattr): Used posix_madvise() instead of madvise().

Added:
    stdcxx/branches/4.2.x/etc/config/src/POSIX_MADVISE.cpp   (with props)
Modified:
    stdcxx/branches/4.2.x/src/memattr.cpp

Added: stdcxx/branches/4.2.x/etc/config/src/POSIX_MADVISE.cpp
URL: 
http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/etc/config/src/POSIX_MADVISE.cpp?rev=900262&view=auto
==============================================================================
--- stdcxx/branches/4.2.x/etc/config/src/POSIX_MADVISE.cpp (added)
+++ stdcxx/branches/4.2.x/etc/config/src/POSIX_MADVISE.cpp Mon Jan 18 01:21:27 
2010
@@ -0,0 +1,40 @@
+// checking for posix_madvise() in <sys/mman.h>
+
+/***************************************************************************
+ *
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the  License is distributed on an  "AS IS" BASIS,
+ * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
+ * implied.   See  the License  for  the  specific language  governing
+ * permissions and limitations under the License.
+ *
+ **************************************************************************/
+
+#include <sys/mman.h>    // for posix_madvise(), POSIX_MADV_WILLNEED
+#include <sys/types.h>   // for size_t
+
+
+int main (int argc, char *argv[])
+{
+    size_t len = (size_t)argc;
+
+    const int result = posix_madvise (argv, len, POSIX_MADV_WILLNEED);
+
+    if (1 < argc) {
+        // invoke with any command line arguments to test
+        return result;
+    }
+
+    // always succeed when invoked without arguments
+    return 0;
+}

Propchange: stdcxx/branches/4.2.x/etc/config/src/POSIX_MADVISE.cpp
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: stdcxx/branches/4.2.x/etc/config/src/POSIX_MADVISE.cpp
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: stdcxx/branches/4.2.x/src/memattr.cpp
URL: 
http://svn.apache.org/viewvc/stdcxx/branches/4.2.x/src/memattr.cpp?rev=900262&r1=900261&r2=900262&view=diff
==============================================================================
--- stdcxx/branches/4.2.x/src/memattr.cpp (original)
+++ stdcxx/branches/4.2.x/src/memattr.cpp Mon Jan 18 01:21:27 2010
@@ -29,6 +29,8 @@
 
 #define _RWSTD_LIB_SRC
 
+#include <config.h>
+
 #include <errno.h>    // for ENOMEM, errno
 #include <string.h>   // for memchr(), size_t
 
@@ -55,6 +57,11 @@
 
 #  include <sys/mman.h>   // for mincore()
 #  include <sys/types.h>
+#  if defined (_RWSTD_OS_SUNOS) && defined (_RWSTD_NO_POSIX_MADVISE)
+     // can't get a proper prototype for madvise with C++ defines in Solaris 10
+     extern "C" int madvise(caddr_t, size_t, int);
+#  endif
+
 
 #  ifndef _SC_PAGE_SIZE
      // fall back on the alternative macro if it exists,
@@ -93,7 +100,6 @@
   (  _RWSTD_REINTERPRET_CAST (const char*, addr1)  \
    - _RWSTD_REINTERPRET_CAST (const char*, addr2))
 
-
 _RWSTD_NAMESPACE (__rw) {
 
 _RWSTD_EXPORT _RWSTD_SSIZE_T
@@ -129,11 +135,21 @@
 
 #  ifdef _RWSTD_OS_SUNOS
 
-        char dummy = '\0';
+#    ifndef _RWSTD_NO_POSIX_MADVISE
+
+       const int advice = POSIX_MADV_WILLNEED;
+
+        // on Solaris use posix_madvise if available
+        if (-1 == posix_madvise (next, 1, advice)) {
+
+#    else
+
+       const int advice = MADV_WILLNEED;
+
+        // on Solaris use madvise if available
+        if (-1 == madvise (next, 1, advice)) {
 
-        // on Solaris use mincore() instead of madvise() since
-        // the latter is unreliable
-        if (-1 == mincore (next, 1, &dummy)) {
+#    endif  // _RWSTD_NO_POSIX_MADVISE
 
             const int err = errno;
             errno = errno_save;


Reply via email to