public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
From: <jmr@fulcrummicro.com>
To: gcc-gnats@gcc.gnu.org
Subject: libgcj/7532: shutdown hooks not run upon abnormal termination
Date: Wed, 07 Aug 2002 16:16:00 -0000	[thread overview]
Message-ID: <200208072227.g77MRHf03653@churchill.internal.avlsi.com> (raw)


>Number:         7532
>Category:       libgcj
>Synopsis:       shutdown hooks not run upon abnormal termination
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    unassigned
>State:          open
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Wed Aug 07 15:36:00 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator:     Jesse Rosenstock
>Release:        3.3 20020806 (experimental)
>Organization:
>Environment:
System: Linux churchill 2.4.3-12 #1 Fri Jun 8 15:05:56 EDT 2001 i686 unknown
Architecture: i686

	
host: i686-pc-linux-gnu
build: i686-pc-linux-gnu
target: i686-pc-linux-gnu
configured with: ../gcc/configure --prefix=/scratch/app/gcc --enable-threads=posix --enable-shared --enable-languages=c++,java
>Description:
	Shutdown hooks added with Runtime.addShutdownHook() are not run
        if the program terminates abnormally, ie due to Ctrl-C.
>How-To-Repeat:
	W.java: 

public class W {
    public static void main(String[] args) throws Exception {
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            public void run() {
                System.err.println("shutting down");
            }
        }));
        final Object o = new Object();
        synchronized (o) {
            o.wait();
        }
    }
}

; gcj -C W.java

; gij W
<Ctrl-C>
<nothing is printed>

; java W
<Ctrl-C>
shutting down
>Fix:
Here's a patch that installs a signal handler to catch SIGHUP, SIGINT, and
SIGTERM.  The handler calls System.exit() so the shutdown hooks run.
Installation of the signal handlers can be disabled with
--reduce-signal-usage.

Index: gij.cc
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/gij.cc,v
retrieving revision 1.18
diff -c -r1.18 gij.cc
*** gij.cc	27 Feb 2002 05:32:13 -0000	1.18
--- gij.cc	7 Aug 2002 22:13:46 -0000
***************
*** 32,37 ****
--- 32,39 ----
    printf ("  --help            print this help, then exit\n");
    printf ("  --ms=NUMBER       set initial heap size\n");
    printf ("  --mx=NUMBER       set maximum heap size\n");
+   printf ("  --reduce-signal-usage\n");
+   printf ("                    reduce use of OS signals\n");
    printf ("  --version         print version number, then exit\n");
    printf ("\nSee http://gcc.gnu.org/java/ for information on reporting bugs\n");
    exit (0);
***************
*** 115,120 ****
--- 117,124 ----
  	    goto no_arg;
  	  _Jv_SetMaximumHeapSize (argv[++i]);
  	}
+       else if (! strcmp (arg, "-reduce-signal-usage"))
+ 	_Jv_SetReduceSignalUsage (true);
        else
  	{
  	  fprintf (stderr, "gij: unrecognized option -- `%s'\n", argv[i]);
Index: posix.cc
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/posix.cc,v
retrieving revision 1.7
diff -c -r1.7 posix.cc
*** posix.cc	7 Apr 2002 11:26:58 -0000	1.7
--- posix.cc	7 Aug 2002 22:13:46 -0000
***************
*** 17,22 ****
--- 17,23 ----
  #include <signal.h>
  
  #include <jvm.h>
+ #include <java/lang/System.h>
  #include <java/lang/Thread.h>
  #include <java/io/InterruptedIOException.h>
  #include <java/util/Properties.h>
***************
*** 48,53 ****
--- 49,60 ----
  #endif
  }
  
+ static void
+ shutdown (int signum)
+ {
+   ::java::lang::System::exit (128 + signum);
+ }
+ 
  // Platform-specific VM initialization.
  void
  _Jv_platform_initialize (void)
***************
*** 59,66 ****
--- 66,88 ----
    sigemptyset (&act.sa_mask);
    act.sa_flags = 0;
    sigaction (SIGPIPE, &act, NULL);
+ 
+   if (! ::gcj::reduceSignalUsage)
+     {
+       act.sa_handler = &shutdown;
+       sigaction (SIGHUP, &act, NULL);
+       sigaction (SIGINT, &act, NULL);
+       sigaction (SIGTERM, &act, NULL);
+     }
  #else
    signal (SIGPIPE, SIG_IGN);
+ 
+   if (! ::gcj::reduceSignalUsage)
+     {
+       signal (SIGHUP, &shutdown);
+       signal (SIGINT, &shutdown);
+       signal (SIGTERM, &shutdown);
+     }
  #endif
  }
  
Index: prims.cc
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/prims.cc,v
retrieving revision 1.72
diff -c -r1.72 prims.cc
*** prims.cc	10 Mar 2002 03:53:12 -0000	1.72
--- prims.cc	7 Aug 2002 22:13:46 -0000
***************
*** 874,879 ****
--- 874,880 ----
    _Jv_Utf8Const *finit_name;
    
    bool runtimeInitialized = false;
+   bool reduceSignalUsage = false;
  }
  
  jint
***************
*** 1051,1056 ****
--- 1052,1063 ----
  {
    size_t size = parse_heap_size (arg);
    _Jv_GCSetMaximumHeapSize (size);
+ }
+ 
+ void
+ _Jv_SetReduceSignalUsage (bool reduce_signal_usage)
+ {
+   ::gcj::reduceSignalUsage = reduce_signal_usage;
  }
  
  \f
Index: include/jvm.h
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/include/jvm.h,v
retrieving revision 1.51
diff -c -r1.51 jvm.h
*** include/jvm.h	11 Apr 2002 15:57:56 -0000	1.51
--- include/jvm.h	7 Aug 2002 22:13:47 -0000
***************
*** 148,153 ****
--- 148,158 ----
    
    /* Set to true by _Jv_CreateJavaVM. */
    extern bool runtimeInitialized;
+ 
+   /* Controls whether or not the usage of signals by the runtime should
+      be reduced.  If set to true, shutdown hooks registered with
+      Runtime.addShutdownHook() may not run upon abnormal termination.  */
+   extern bool reduceSignalUsage;
  };
  
  /* Type of pointer used as finalizer.  */
***************
*** 225,230 ****
--- 230,241 ----
     number which can optionally have "k" or "m" appended and calls
     _Jv_GCSetMaximumHeapSize.  */
  void _Jv_SetMaximumHeapSize (const char *arg);
+ 
+ /* External interface to controlling whether or not the usage of signals
+    by the runtime should be reduced.  If set to true, shutdown hooks
+    registered with Runtime.addShutdownHook() may not run upon abnormal
+    termination.  */
+ void _Jv_SetReduceSignalUsage (bool reduce_signal_usage);
  
  extern "C" void JvRunMain (jclass klass, int argc, const char **argv);
  void _Jv_RunMain (jclass klass, const char *name, int argc, const char **argv, 
>Release-Note:
>Audit-Trail:
>Unformatted:


             reply	other threads:[~2002-08-07 22:36 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-08-07 16:16 jmr [this message]
2002-08-07 16:26 Andrew Pinski
2002-08-07 16:36 Jesse Rosenstock
2002-08-16 15:26 Tom Tromey
2002-08-19  3:26 Andrew Haley

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200208072227.g77MRHf03653@churchill.internal.avlsi.com \
    --to=jmr@fulcrummicro.com \
    --cc=gcc-gnats@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).