summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2010-04-20 10:44:52 +0000
committerCorinna Vinschen <corinna@vinschen.de>2010-04-20 10:44:52 +0000
commit9e40fe81120619ab9fb1f610d7c2a5062915dca4 (patch)
tree4ea4b69163ece41dbf84f7f8e2dc45e726c4b22e
parent2ac91a14831702681737bfac01e0772f04375b49 (diff)
downloadcygnal-9e40fe81120619ab9fb1f610d7c2a5062915dca4.tar.gz
cygnal-9e40fe81120619ab9fb1f610d7c2a5062915dca4.tar.bz2
cygnal-9e40fe81120619ab9fb1f610d7c2a5062915dca4.zip
* cygheap.h (struct init_cygheap): Add rlim_core member.
* cygheap.cc (cygheap_init): Initialize rlim_core to RLIM_INFINITY. * exceptions.cc (stackdump): Drop extern declaration of rlim_core. Refer to cygheap->rlim_core instead. (exception::handle): Disable stackdumping if cygheap->rlim_core is 0. Don't set WCOREDUMP flag in exit code, if cygheap->rlim_core is 0. (sigpacket::process): Ditto. * resource.cc (rlim_core): Remove. (getrlimit): Fetch RLIMIT_CORE value from cygheap->rlim_core. (setrlimit): Store RLIMIT_CORE value in cygheap->rlim_core.
-rw-r--r--winsup/cygwin/ChangeLog13
-rw-r--r--winsup/cygwin/cygheap.cc4
-rw-r--r--winsup/cygwin/cygheap.h4
-rw-r--r--winsup/cygwin/exceptions.cc18
-rw-r--r--winsup/cygwin/resource.cc9
5 files changed, 34 insertions, 14 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 6938f4986..db753dd3e 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,16 @@
+2010-04-20 Corinna Vinschen <corinna@vinschen.de>
+
+ * cygheap.h (struct init_cygheap): Add rlim_core member.
+ * cygheap.cc (cygheap_init): Initialize rlim_core to RLIM_INFINITY.
+ * exceptions.cc (stackdump): Drop extern declaration of rlim_core.
+ Refer to cygheap->rlim_core instead.
+ (exception::handle): Disable stackdumping if cygheap->rlim_core is 0.
+ Don't set WCOREDUMP flag in exit code, if cygheap->rlim_core is 0.
+ (sigpacket::process): Ditto.
+ * resource.cc (rlim_core): Remove.
+ (getrlimit): Fetch RLIMIT_CORE value from cygheap->rlim_core.
+ (setrlimit): Store RLIMIT_CORE value in cygheap->rlim_core.
+
2010-04-19 Christopher Faylor <me+cygwin@cgf.cx>
* cygerrno.h: Nevermind.
diff --git a/winsup/cygwin/cygheap.cc b/winsup/cygwin/cygheap.cc
index f518aa9e5..6cbdda934 100644
--- a/winsup/cygwin/cygheap.cc
+++ b/winsup/cygwin/cygheap.cc
@@ -1,6 +1,7 @@
/* cygheap.cc: Cygwin heap manager.
- Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Red Hat, Inc.
+ Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+ 2010 Red Hat, Inc.
This file is part of Cygwin.
@@ -167,6 +168,7 @@ cygheap_init ()
strcpy (cygheap->locale.charset, "UTF-8");
/* Set umask to a sane default. */
cygheap->umask = 022;
+ cygheap->rlim_core = RLIM_INFINITY;
}
if (!cygheap->fdtab)
cygheap->fdtab.init ();
diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h
index b8ffd3fbe..764e72240 100644
--- a/winsup/cygwin/cygheap.h
+++ b/winsup/cygwin/cygheap.h
@@ -1,6 +1,7 @@
/* cygheap.h: Cygwin heap manager.
- Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Red Hat, Inc.
+ Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
+ 2010 Red Hat, Inc.
This file is part of Cygwin.
@@ -274,6 +275,7 @@ struct init_cygheap: public mini_cygheap
cygheap_user user;
user_heap_info user_heap;
mode_t umask;
+ unsigned long rlim_core;
HANDLE console_h;
cwdstuff cwd;
dtable fdtab;
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 39b56eac5..ed72f7967 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -286,10 +286,9 @@ stack_info::walk ()
static void
stackdump (DWORD ebp, int open_file, bool isexception)
{
- extern unsigned long rlim_core;
static bool already_dumped;
- if (rlim_core == 0UL || (open_file && already_dumped))
+ if (cygheap->rlim_core == 0UL || (open_file && already_dumped))
return;
if (open_file)
@@ -662,9 +661,12 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void
}
rtl_unwind (frame, e);
- open_stackdumpfile ();
- dump_exception (e, in);
- stackdump ((DWORD) ebp, 0, 1);
+ if (cygheap->rlim_core > 0UL)
+ {
+ open_stackdumpfile ();
+ dump_exception (e, in);
+ stackdump ((DWORD) ebp, 0, 1);
+ }
}
if (e->ExceptionCode == STATUS_ACCESS_VIOLATION)
@@ -683,7 +685,8 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void
? 0 : 4) | (e->ExceptionInformation[0] << 1));
}
- me.signal_exit (0x80 | si.si_signo); // Flag signal + core dump
+ /* Flag signal + core dump */
+ me.signal_exit ((cygheap->rlim_core > 0UL ? 0x80 : 0) | si.si_signo);
}
si.si_addr = (si.si_signo == SIGSEGV || si.si_signo == SIGBUS
@@ -1310,7 +1313,8 @@ exit_sig:
c.ContextFlags = CONTEXT_FULL;
GetThreadContext (hMainThread, &c);
use_tls->copy_context (&c);
- si.si_signo |= 0x80;
+ if (cygheap->rlim_core > 0UL)
+ si.si_signo |= 0x80;
}
sigproc_printf ("signal %d, about to call do_exit", si.si_signo);
use_tls->signal_exit (si.si_signo); /* never returns */
diff --git a/winsup/cygwin/resource.cc b/winsup/cygwin/resource.cc
index 6da9c6814..fed61e8ee 100644
--- a/winsup/cygwin/resource.cc
+++ b/winsup/cygwin/resource.cc
@@ -1,6 +1,6 @@
/* resource.cc: getrusage () and friends.
- Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2009 Red Hat, Inc.
+ Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2009, 2010 Red Hat, Inc.
Written by Steve Chamberlain (sac@cygnus.com), Doug Evans (dje@cygnus.com),
Geoffrey Noer (noer@cygnus.com) of Cygnus Support.
@@ -21,6 +21,7 @@ details. */
#include "fhandler.h"
#include "pinfo.h"
#include "dtable.h"
+#include "cygheap.h"
/* add timeval values */
static void
@@ -109,8 +110,6 @@ getrusage (int intwho, struct rusage *rusage_in)
return res;
}
-unsigned long rlim_core = RLIM_INFINITY;
-
extern "C" int
getrlimit (int resource, struct rlimit *rlp)
{
@@ -146,7 +145,7 @@ getrlimit (int resource, struct rlimit *rlp)
rlp->rlim_max = OPEN_MAX_MAX;
break;
case RLIMIT_CORE:
- rlp->rlim_cur = rlim_core;
+ rlp->rlim_cur = cygheap->rlim_core;
break;
case RLIMIT_AS:
rlp->rlim_cur = 0x80000000UL;
@@ -182,7 +181,7 @@ setrlimit (int resource, const struct rlimit *rlp)
switch (resource)
{
case RLIMIT_CORE:
- rlim_core = rlp->rlim_cur;
+ cygheap->rlim_core = rlp->rlim_cur;
break;
case RLIMIT_NOFILE:
if (rlp->rlim_cur != RLIM_INFINITY)