OSDN Git Service

* cygwin.din: Add symbols for `getrlimit' and `setrlimit'.
authorcorinna <corinna>
Wed, 27 Dec 2000 00:13:57 +0000 (00:13 +0000)
committercorinna <corinna>
Wed, 27 Dec 2000 00:13:57 +0000 (00:13 +0000)
        * 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
winsup/cygwin/cygwin.din
winsup/cygwin/exceptions.cc
winsup/cygwin/include/cygwin/version.h
winsup/cygwin/include/sys/resource.h
winsup/cygwin/resource.cc

index 649fc47..10e7e30 100644 (file)
@@ -1,3 +1,16 @@
+Tue Dec 27  1:08:00 2000  Corinna Vinschen <corinna@vinschen.de>
+
+       * 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 <cgf@cygnus.com>
 
        * autoload.h: Make DLL initializers global to avoid inlining.
index 8bb86ec..c01a4b7 100644 (file)
@@ -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
index c50e5c1..9b13a00 100644 (file)
@@ -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 */
index c41a9c3..0e51b31 100644 (file)
@@ -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
index a709ec0..1f859cf 100644 (file)
@@ -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
index 58c2ced..e8e53d1 100644 (file)
@@ -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;
+}