From 6a7bea70f0ec5a13f0f46be928f6c5284765ba53 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Mon, 8 Aug 2005 04:06:07 +0000 Subject: [PATCH] * Makefile.in (dtable_CFLAGS): Use -fomit-frame-pointer and -fcheck-new. * cygheap.cc (cmalloc): Only emit system_printf warnings on failure if DEBUGGING. (crealloc): Ditto. (ccalloc): Ditto. * dtable.cc (build_fh_name): Treat NULL return from cnew as indicative of EMFILE condition. (build_fh_dev): Ditto. (dtable::dup_worker): Handle NULL return from build_fh_pc. (dtable::vfork_child_dup): Trust dup_worker to set errno. * fhandler.h (fhandler_base::new): Mark as nothrow. --- winsup/cygwin/ChangeLog | 15 +++++++++++++ winsup/cygwin/Makefile.in | 1 + winsup/cygwin/cygheap.cc | 6 +++++- winsup/cygwin/dcrt0.cc | 5 +++++ winsup/cygwin/dtable.cc | 44 ++++++++++++++++++++++++--------------- winsup/cygwin/fhandler.h | 2 +- 6 files changed, 54 insertions(+), 19 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index ea4b04680..ba6e11da1 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,18 @@ +2005-08-07 Christopher Faylor + + * Makefile.in (dtable_CFLAGS): Use -fomit-frame-pointer and + -fcheck-new. + * cygheap.cc (cmalloc): Only emit system_printf warnings on failure if + DEBUGGING. + (crealloc): Ditto. + (ccalloc): Ditto. + * dtable.cc (build_fh_name): Treat NULL return from cnew as indicative + of EMFILE condition. + (build_fh_dev): Ditto. + (dtable::dup_worker): Handle NULL return from build_fh_pc. + (dtable::vfork_child_dup): Trust dup_worker to set errno. + * fhandler.h (fhandler_base::new): Mark as nothrow. + 2005-08-07 Christopher Faylor * dllfixdbg: New perl script. diff --git a/winsup/cygwin/Makefile.in b/winsup/cygwin/Makefile.in index ebf5e2632..930c00ad3 100644 --- a/winsup/cygwin/Makefile.in +++ b/winsup/cygwin/Makefile.in @@ -230,6 +230,7 @@ devices_CFLAGS:=-fomit-frame-pointer -Os dir_CFLAGS:=-fomit-frame-pointer dlfcn_CFLAGS:=-fomit-frame-pointer dll_init_CFLAGS:=-fomit-frame-pointer +dtable_CFLAGS:=-fomit-frame-pointer -fcheck-new fcntl_CFLAGS:=-fomit-frame-pointer fhandler_CFLAGS:=-fomit-frame-pointer fhandler_clipboard_CFLAGS:=-fomit-frame-pointer diff --git a/winsup/cygwin/cygheap.cc b/winsup/cygwin/cygheap.cc index 9f2f7d4b3..00f7b07e4 100644 --- a/winsup/cygwin/cygheap.cc +++ b/winsup/cygwin/cygheap.cc @@ -279,8 +279,8 @@ cmalloc (cygheap_types x, DWORD n) c = (cygheap_entry *) _cmalloc (sizeof_cygheap (n)); if (!c) { - system_printf ("cmalloc returned NULL"); #ifdef DEBUGGING + system_printf ("cmalloc returned NULL"); try_to_debug (); #endif } @@ -298,8 +298,10 @@ crealloc (void *s, DWORD n) cygheap_entry *c = tocygheap (s); cygheap_types t = (cygheap_types) c->type; c = (cygheap_entry *) _crealloc (c, sizeof_cygheap (n)); +#ifdef DEBUGGING if (!c) system_printf ("crealloc returned NULL"); +#endif return creturn (t, c, n); } @@ -328,8 +330,10 @@ ccalloc (cygheap_types x, DWORD n, DWORD size) c = (cygheap_entry *) _cmalloc (sizeof_cygheap (n)); if (c) memset (c->data, 0, n); +#ifdef DEBUGGING if (!c) system_printf ("ccalloc returned NULL"); +#endif return creturn (x, c, n); } diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 9fd9fa8ba..7cc3ea968 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -725,6 +725,11 @@ dll_crt0_1 (char *) check_sanity_and_sync (user_data); malloc_init (); +#ifdef CGF + int i = 0; + while (i) + cmalloc (HEAP_STR, 2000000); +#endif /* Initialize SIGSEGV handling, etc. */ init_exceptions (&cygwin_except_entry); diff --git a/winsup/cygwin/dtable.cc b/winsup/cygwin/dtable.cc index 3dd540bc8..4164740ee 100644 --- a/winsup/cygwin/dtable.cc +++ b/winsup/cygwin/dtable.cc @@ -342,8 +342,9 @@ build_fh_name (const char *name, HANDLE h, unsigned opt, suffix_info *si) if (pc.error) { fhandler_base *fh = cnew (fhandler_nodevice) (); - fh->set_error (pc.error); - set_errno (pc.error); + if (fh) + fh->set_error (pc.error); + set_errno (fh ? pc.error : EMFILE); return fh; } @@ -364,10 +365,11 @@ build_fh_dev (const device& dev, const char *unix_name) return build_fh_pc (pc); } +#define fh_unset ((fhandler_base *) 1) fhandler_base * build_fh_pc (path_conv& pc) { - fhandler_base *fh = NULL; + fhandler_base *fh = fh_unset; switch (pc.dev.major) { @@ -472,9 +474,13 @@ build_fh_pc (path_conv& pc) } if (!fh) - fh = cnew (fhandler_nodevice) (); - - fh->set_name (pc); + set_errno (EMFILE); + else + { + if (fh == fh_unset) + fh = cnew (fhandler_nodevice) (); + fh->set_name (pc); + } debug_printf ("fh %p", fh); return fh; @@ -484,18 +490,23 @@ fhandler_base * dtable::dup_worker (fhandler_base *oldfh) { fhandler_base *newfh = build_fh_pc (oldfh->pc); - *newfh = *oldfh; - newfh->set_io_handle (NULL); - if (oldfh->dup (newfh)) + if (!newfh) + debug_printf ("build_fh_pc failed"); + else { - cfree (newfh); - newfh = NULL; - return NULL; + *newfh = *oldfh; + newfh->set_io_handle (NULL); + if (oldfh->dup (newfh)) + { + cfree (newfh); + debug_printf ("oldfh->dup failed"); + } + else + { + newfh->close_on_exec (false); + debug_printf ("duped '%s' old %p, new %p", oldfh->get_name (), oldfh->get_io_handle (), newfh->get_io_handle ()); + } } - - newfh->close_on_exec (false); - MALLOC_CHECK; - debug_printf ("duped '%s' old %p, new %p", oldfh->get_name (), oldfh->get_io_handle (), newfh->get_io_handle ()); return newfh; } @@ -745,7 +756,6 @@ dtable::vfork_child_dup () else { res = 0; - set_errno (EBADF); goto out; } diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index 6b698fa40..04a80b0dc 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -301,7 +301,7 @@ class fhandler_base _off64_t offset, DWORD size, void *address); - void *operator new (size_t, void *p) {return p;} + void *operator new (size_t, void *p) __attribute__ ((nothrow)) {return p;} virtual void init (HANDLE, DWORD, mode_t);