> -----Original Message-----
> From: Martin Sebor [mailto:[EMAIL PROTECTED]
> Sent: Thursday, June 07, 2007 6:32 PM
> To: [email protected]
> 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: [email protected]
> >> 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)) {