From 8a93913d2652b0f3f42b5d2d9214e16a1f115494 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 27 Dec 2000 00:13:57 +0000 Subject: [PATCH] * cygwin.din: Add symbols for `getrlimit' and `setrlimit'. * exceptions.cc (stackdump): Avoid creating stackdump when `rlim_core' is 0. * resource.cc: New global variable `rlim_core'. (getrlimit): New function. (setrlimit): Ditto. include/cygwin/version.h: Bump minor API version to 32 due to adding `getrlimit' and `setrlimit'. include/sys/resource.h: Add defines, types and prototypes for `getrlimit' and `setrlimit'. --- winsup/cygwin/ChangeLog | 13 ++++++ winsup/cygwin/cygwin.din | 4 ++ winsup/cygwin/exceptions.cc | 5 +++ winsup/cygwin/include/cygwin/version.h | 3 +- winsup/cygwin/include/sys/resource.h | 23 +++++++++++ winsup/cygwin/resource.cc | 55 ++++++++++++++++++++++++++ 6 files changed, 102 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 649fc4741..10e7e30af 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,16 @@ +Tue Dec 27 1:08:00 2000 Corinna Vinschen + + * cygwin.din: Add symbols for `getrlimit' and `setrlimit'. + * exceptions.cc (stackdump): Avoid creating stackdump when + `rlim_core' is 0. + * resource.cc: New global variable `rlim_core'. + (getrlimit): New function. + (setrlimit): Ditto. + include/cygwin/version.h: Bump minor API version to 32 due to + adding `getrlimit' and `setrlimit'. + include/sys/resource.h: Add defines, types and prototypes for + `getrlimit' and `setrlimit'. + Mon Dec 25 22:18:42 2000 Christopher Faylor * autoload.h: Make DLL initializers global to avoid inlining. diff --git a/winsup/cygwin/cygwin.din b/winsup/cygwin/cygwin.din index 8bb86ecea..c01a4b727 100644 --- a/winsup/cygwin/cygwin.din +++ b/winsup/cygwin/cygwin.din @@ -347,6 +347,8 @@ getpid _getpid = getpid getppid _getppid = getppid +getrlimit +_getrlimit = getrlimit getrusage _getrusage = getrusage gets @@ -622,6 +624,8 @@ setlocale _setlocale = setlocale setpgid _setpgid = setpgid +setrlimit +_setrlimit = setrlimit setsid _setsid = setsid settimeofday diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index c50e5c18a..9b13a00a9 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -381,7 +381,12 @@ try_to_debug () static void stackdump (EXCEPTION_RECORD *e, CONTEXT *in) { + extern unsigned long rlim_core; const char *p; + + if (rlim_core == 0UL) + return; + if (myself->progname[0]) { /* write to progname.stackdump if possible */ diff --git a/winsup/cygwin/include/cygwin/version.h b/winsup/cygwin/include/cygwin/version.h index c41a9c3a1..0e51b31fd 100644 --- a/winsup/cygwin/include/cygwin/version.h +++ b/winsup/cygwin/include/cygwin/version.h @@ -122,10 +122,11 @@ details. */ 29: Export hstrerror 30: CW_GET_CYGDRIVE_INFO addition to external.cc 31: Export inet_aton + 32: Export getrlimit/setrlimit */ #define CYGWIN_VERSION_API_MAJOR 0 -#define CYGWIN_VERSION_API_MINOR 31 +#define CYGWIN_VERSION_API_MINOR 32 /* There is also a compatibity version number associated with the shared memory regions. It is incremented when incompatible diff --git a/winsup/cygwin/include/sys/resource.h b/winsup/cygwin/include/sys/resource.h index a709ec00f..1f859cf0f 100644 --- a/winsup/cygwin/include/sys/resource.h +++ b/winsup/cygwin/include/sys/resource.h @@ -7,6 +7,26 @@ extern "C" { #endif +#define RLIMIT_CPU 0 /* CPU time in seconds */ +#define RLIMIT_FSIZE 1 /* Maximum filesize */ +#define RLIMIT_DATA 2 /* max data size */ +#define RLIMIT_STACK 3 /* max stack size */ +#define RLIMIT_CORE 4 /* max core file size */ +#define RLIMIT_NOFILE 5 /* max number of open files */ +#define RLIMIT_OFILE RLIMIT_NOFILE /* BSD name */ +#define RLIMIT_AS 6 /* address space (virt. memory) limit */ + +#define RLIM_INFINITY (0xffffffffUL) +#define RLIM_SAVED_MAX RLIM_INFINITY +#define RLIM_SAVED_CUR RLIM_INFINITY + +typedef unsigned long rlim_t; + +struct rlimit { + rlim_t rlim_cur; + rlim_t rlim_max; +}; + #define RUSAGE_SELF 0 /* calling process */ #define RUSAGE_CHILDREN -1 /* terminated child processes */ @@ -30,6 +50,9 @@ struct rusage { #define ru_last ru_nivcsw }; +int getrlimit (int __resource, struct rlimit *__rlp); +int setrlimit (int __resource, const struct rlimit *__rlp); + int getrusage (int __who, struct rusage *__rusage); #ifdef __cplusplus diff --git a/winsup/cygwin/resource.cc b/winsup/cygwin/resource.cc index 58c2ced25..e8e53d110 100644 --- a/winsup/cygwin/resource.cc +++ b/winsup/cygwin/resource.cc @@ -97,3 +97,58 @@ getrusage (int intwho, struct rusage *rusage_in) syscall_printf ("%d = getrusage (%d, %p)", res, intwho, rusage_in); return res; } + +unsigned long rlim_core = RLIM_INFINITY; + +extern "C" +int +getrlimit (int resource, struct rlimit *rlp) +{ + MEMORY_BASIC_INFORMATION m; + if (!rlp || !VirtualQuery (rlp, &m, sizeof (m)) || (m.State != MEM_COMMIT)) + return EFAULT; + + rlp->rlim_cur = RLIM_INFINITY; + rlp->rlim_max = RLIM_INFINITY; + + switch (resource) + { + case RLIMIT_CPU: + case RLIMIT_FSIZE: + case RLIMIT_DATA: + case RLIMIT_STACK: + case RLIMIT_NOFILE: + break; + case RLIMIT_CORE: + rlp->rlim_cur = rlim_core; + break; + case RLIMIT_AS: + rlp->rlim_cur = 0x80000000UL; + rlp->rlim_max = 0x80000000UL; + break; + default: + set_errno (EINVAL); + return -1; + } + return 0; +} + +extern "C" +int +setrlimit (int resource, const struct rlimit *rlp) +{ + MEMORY_BASIC_INFORMATION m; + if (!rlp || !VirtualQuery (rlp, &m, sizeof (m)) || (m.State != MEM_COMMIT)) + return EFAULT; + + switch (resource) + { + case RLIMIT_CORE: + rlim_core = rlp->rlim_cur; + break; + default: + set_errno (EINVAL); + return -1; + } + return 0; +}