pier 01/06/25 20:24:54 Modified: service/native java.c java.h jsvc-unix.c Log: Fixed bug preventing LINUX to executing a clean shutdown/reload. Revision Changes Path 1.2 +23 -2 jakarta-tomcat-4.0/service/native/java.c Index: java.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/service/native/java.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- java.c 2001/06/26 01:37:06 1.1 +++ java.c 2001/06/26 03:24:52 1.2 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -/* @version $Id: java.c,v 1.1 2001/06/26 01:37:06 pier Exp $ */ +/* @version $Id: java.c,v 1.2 2001/06/26 03:24:52 pier Exp $ */ #include "jsvc.h" #include <jni.h> @@ -227,8 +227,29 @@ } /* Destroy the Java VM */ -bool java_destroy(void) { +bool java_destroy(int exit) { + jclass system=NULL; + jmethodID method; + + system=(*env)->FindClass(env,"java/lang/System"); + if (system==NULL) { + log_error("Cannot find class java/lang/System"); + return(false); + } + + method=(*env)->GetStaticMethodID(env,system,"exit","(I)V"); + if (method==NULL) { + log_error("Cannot found \"System.exit(int)\" entry point"); + return(false); + } + + log_debug("Calling System.exit(%d)",exit); + (*env)->CallStaticVoidMethod(env,cls,method,(jint)exit); + + /* We shouldn't get here, but just in case... */ + log_debug("Destroying the Java VM"); if ((*jvm)->DestroyJavaVM(jvm)!=0) return(false); + log_debug("Java VM destroyed"); return(true); } 1.2 +2 -2 jakarta-tomcat-4.0/service/native/java.h Index: java.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/service/native/java.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- java.h 2001/06/26 01:37:16 1.1 +++ java.h 2001/06/26 03:24:53 1.2 @@ -55,13 +55,13 @@ * * * ========================================================================= */ -/* @version $Id: java.h,v 1.1 2001/06/26 01:37:16 pier Exp $ */ +/* @version $Id: java.h,v 1.2 2001/06/26 03:24:53 pier Exp $ */ #define LOADER "org/apache/service/support/ServiceLoader" char *java_library(arg_data *args, home_data *data); bool java_init(arg_data *args, home_data *data); -bool java_destroy(void); +bool java_destroy(int exit); bool java_load(arg_data *args); bool java_start(void); bool java_stop(void); 1.2 +8 -8 jakarta-tomcat-4.0/service/native/jsvc-unix.c Index: jsvc-unix.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/service/native/jsvc-unix.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- jsvc-unix.c 2001/06/26 01:37:25 1.1 +++ jsvc-unix.c 2001/06/26 03:24:53 1.2 @@ -55,7 +55,7 @@ * * * ========================================================================= */ -/* @version $Id: jsvc-unix.c,v 1.1 2001/06/26 01:37:25 pier Exp $ */ +/* @version $Id: jsvc-unix.c,v 1.2 2001/06/26 03:24:53 pier Exp $ */ #include "jsvc.h" #include <signal.h> @@ -189,6 +189,7 @@ static int child(arg_data *args, home_data *data, uid_t uid, gid_t gid) { FILE *pidf=fopen(args->pidf,"w"); pid_t pidn=getpid(); + int ret=0; if (pidf!=NULL) { fprintf(pidf,"%d\n",(int)pidn); @@ -243,14 +244,13 @@ /* Start the service */ if (java_stop()!=true) return(6); - /* Destroy the Java VM */ - if (java_destroy()!=true) return(7); + if (doreload==true) ret=123; + else ret=0; - /* Remove PID file */ - unlink(args->pidf); + /* Destroy the Java VM */ + if (java_destroy(ret)!=true) return(7); - if (doreload==true) return(123); - else return(0); + return(ret); } int main(int argc, char *argv[]) { @@ -330,7 +330,7 @@ will be the child */ while ((pid=fork())!=-1) { /* We forked (again), if this is the child, we go on normally */ - if (pid==0) return(child(args,data,uid,gid)); + if (pid==0) exit(child(args,data,uid,gid)); /* We are in the controller, we have to forward all interesting signals to the child, and wait for it to die */