> -----Original Message-----
> From: Martin Sebor [mailto:[EMAIL PROTECTED]
> Sent: Thursday, June 07, 2007 6:32 PM
> To: stdcxx-dev@incubator.apache.org
> Subject: Re: STD_BAD_ALLOC.cpp test problem on Windows
>
> Farid Zaripov wrote:
> >> -----Original Message-----
> >> From: Martin Sebor [mailto:[EMAIL PROTECTED]
> >> Sent: Wednesday, June 06, 2007 9:45 PM
> >> To: stdcxx-dev@incubator.apache.org
> >> Subject: Re: STD_BAD_ALLOC.cpp test problem on Windows
> >>
> >> Still, are you aware of any Windows API that lets programs
> limit the
> >> amount of dynamic memory available to them, like
> >> setrusage() does on UNIX? I ask because allocating so much storage
> >> can put a big stress on the system, even if for just a few seconds.
> >
> >   The process memory (and/or user-mode time) can be limited
> using job
> > object, but this possibility available on Windows 2000 and
> later (not
> > available on Windows NT).
>
> That's better than nothing. Would it be pretty easy to do in the test?

 The proposed patch is attached.

Farid.

Index: etc/config/src/GLOBAL_BAD_ALLOC.cpp
===================================================================
--- etc/config/src/GLOBAL_BAD_ALLOC.cpp (revision 548260)
+++ etc/config/src/GLOBAL_BAD_ALLOC.cpp (working copy)
@@ -7,9 +7,11 @@
 #endif   // !_RWSTD_NO_NEW_THROWS && !_RWSTD_NO_NEW_OFLOW_SAFE
 
 #ifndef _RWSTD_NO_SETRLIMIT
-#  include <sys/resource.h>   // for setrlimit()
+// test for setrlimit() presence before compiling current file
 #endif
 
+#include "proclim.h"
+
 #ifndef _RWSTD_NO_HONOR_STD
 #  ifdef _RWSTD_NO_STD_TERMINATE
 
@@ -74,13 +76,8 @@
 
 #  else   // if defined (_RWSTD_NO_NEW_OFLOW_SAFE)
 
-#ifndef _RWSTD_NO_SETRLIMIT
+        limit_memory (0);
 
-        struct rlimit rl = { 0, 0 };
-        setrlimit (RLIMIT_DATA, &rl);
-
-#endif   // _RWSTD_NO_SETRLIMIT
-
         for (unsigned long n = 1UL << (sizeof (long) * 8 - 1);
              0 != n; n |= (n >> 1)) {
 
Index: etc/config/src/NEW_THROWS.cpp
===================================================================
--- etc/config/src/NEW_THROWS.cpp       (revision 548260)
+++ etc/config/src/NEW_THROWS.cpp       (working copy)
@@ -5,9 +5,10 @@
 #include <stdio.h>
 
 #ifndef _RWSTD_NO_SETRLIMIT
-#  include <sys/resource.h>   // for setrlimit()
+// test for setrlimit() presence before compiling current file
 #endif   // _RWSTD_NO_SETRLIMIT
 
+#include "proclim.h"
 
 #if 2 == __GNUG__
 #  ifndef _RWSTD_NO_HONOR_STD
@@ -84,16 +85,10 @@
     // by passing it a smaller argument
     printf ("#define _RWSTD_NO_NEW_OFLOW_SAFE\n");
 
-#ifndef _RWSTD_NO_SETRLIMIT
-
     // decrease resource limit to a minimum to induce a failure
     // without unreasonably stressing the system
+    limit_memory (0);
 
-    struct rlimit rl = { 0, 0 };
-    setrlimit (RLIMIT_DATA, &rl);
-
-#endif   // _RWSTD_NO_SETRLIMIT
-
     p = (void*)1;
 
     try {
Index: etc/config/src/proclim.h
===================================================================
--- etc/config/src/proclim.h    (revision 0)
+++ etc/config/src/proclim.h    (revision 0)
@@ -0,0 +1,54 @@
+#if !defined (_RWSTD_NO_SETRLIMIT)
+
+#  include <sys/resource.h>   // for setrlimit()
+
+void limit_memory (unsigned long limit)
+{
+    struct rlimit rl = { limit, limit };
+    setrlimit (RLIMIT_DATA, &rl);
+}
+
+#elif defined (_WIN32)
+
+#  ifndef _WIN32_WINNT
+#    define _WIN32_WINNT 0x0500
+#  endif
+
+#  if _WIN32_WINNT >= 0x0500
+
+// Job Objects available only in Windows 2000 and later
+
+#    include <windows.h>
+
+void limit_memory (unsigned long limit)
+{
+    SYSTEM_INFO info;
+    GetSystemInfo (&info);
+
+    HANDLE hJob = CreateJobObject (NULL, NULL);
+    if (hJob) {
+        if (AssignProcessToJobObject (hJob, GetCurrentProcess ())) {
+            JOBOBJECT_EXTENDED_LIMIT_INFORMATION job_info = { 0 };
+            job_info.BasicLimitInformation.LimitFlags =
+                JOB_OBJECT_LIMIT_PROCESS_MEMORY;
+            job_info.ProcessMemoryLimit =
+                limit > info.dwPageSize ? limit : info.dwPageSize;
+            SetInformationJobObject (hJob,
+                                     JobObjectExtendedLimitInformation,
+                                     &job_info, sizeof (job_info));
+        }
+        CloseHandle (hJob);
+    }
+}
+
+#  else   // _WIN32_WINNT < 0x0500
+
+void limit_memory (unsigned long) { /* no-op */ }
+
+#  endif  // _WIN32_WINNT
+
+#else   // _RWSTD_NO_SETRLIMIT && !_WIN32
+
+void limit_memory (unsigned long) { /* no-op */ }
+
+#endif  // _RWSTD_NO_SETRLIMIT

Property changes on: etc\config\src\proclim.h
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Index: etc/config/src/STD_BAD_ALLOC.cpp
===================================================================
--- etc/config/src/STD_BAD_ALLOC.cpp    (revision 548260)
+++ etc/config/src/STD_BAD_ALLOC.cpp    (working copy)
@@ -7,9 +7,11 @@
 #endif   // !_RWSTD_NO_NEW_THROWS && !_RWSTD_NO_NEW_OFLOW_SAFE
 
 #ifndef _RWSTD_NO_SETRLIMIT
-#  include <sys/resource.h>   // for setrlimit()
+// test for setrlimit() presence before compiling current file
 #endif
 
+#include "proclim.h"
+
 #ifndef _RWSTD_NO_HONOR_STD
 #  ifdef _RWSTD_NO_STD_TERMINATE
 
@@ -81,13 +83,8 @@
 
 #  else   // if defined (_RWSTD_NO_NEW_OFLOW_SAFE)
 
-#ifndef _RWSTD_NO_SETRLIMIT
+        limit_memory (0);
 
-        struct rlimit rl = { 0, 0 };
-        setrlimit (RLIMIT_DATA, &rl);
-
-#endif   // _RWSTD_NO_SETRLIMIT
-
         for (unsigned long n = 1UL << (sizeof (long) * 8 - 1);
              0 != n; n |= (n >> 1)) {
 

Reply via email to