You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by jf...@apache.org on 2005/04/22 18:34:57 UTC
svn commit: r164252 - in
/jakarta/commons/proper/daemon/trunk/src/native/unix/native: arguments.c
arguments.h jsvc-unix.c
Author: jfclere
Date: Fri Apr 22 09:34:52 2005
New Revision: 164252
URL: http://svn.apache.org/viewcvs?rev=164252&view=rev
Log:
Try to implement wait until JVM is started...
Modified:
jakarta/commons/proper/daemon/trunk/src/native/unix/native/arguments.c
jakarta/commons/proper/daemon/trunk/src/native/unix/native/arguments.h
jakarta/commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c
Modified: jakarta/commons/proper/daemon/trunk/src/native/unix/native/arguments.c
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/daemon/trunk/src/native/unix/native/arguments.c?rev=164252&r1=164251&r2=164252&view=diff
==============================================================================
--- jakarta/commons/proper/daemon/trunk/src/native/unix/native/arguments.c (original)
+++ jakarta/commons/proper/daemon/trunk/src/native/unix/native/arguments.c Fri Apr 22 09:34:52 2005
@@ -42,6 +42,8 @@
args->vers=false; /* Don't display version */
args->help=false; /* Don't display help */
args->chck=false; /* Don't do a check-only startup */
+ args->stop=false; /* Stop a running jsvc */
+ args->wait=false; /* Wait until jsvc has started the JVM */
args->install=false; /* Don't install as a service */
args->remove=false; /* Don't remove the installed service */
args->service=false; /* Don't run as a service */
@@ -112,6 +114,12 @@
} else if (strcmp(argv[x],"-debug")==0) {
log_debug_flag=true;
+
+ } else if (strcmp(argv[x],"-wait")==0) {
+ args->wait=true;
+
+ } else if (strcmp(argv[x],"-stop")==0) {
+ args->wait=true;
} else if (strcmp(argv[x],"-check")==0) {
args->chck=true;
Modified: jakarta/commons/proper/daemon/trunk/src/native/unix/native/arguments.h
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/daemon/trunk/src/native/unix/native/arguments.h?rev=164252&r1=164251&r2=164252&view=diff
==============================================================================
--- jakarta/commons/proper/daemon/trunk/src/native/unix/native/arguments.h (original)
+++ jakarta/commons/proper/daemon/trunk/src/native/unix/native/arguments.h Fri Apr 22 09:34:52 2005
@@ -51,6 +51,10 @@
bool help;
/** Only check environment without running the service. */
bool chck;
+ /** Stop running jsvc */
+ bool stop;
+ /** Wait until service started */
+ bool wait;
/** Install as a service (win32) */
bool install;
/** Remove when installed as a service (win32) */
Modified: jakarta/commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c?rev=164252&r1=164251&r2=164252&view=diff
==============================================================================
--- jakarta/commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c (original)
+++ jakarta/commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c Fri Apr 22 09:34:52 2005
@@ -294,6 +294,107 @@
}
/*
+ * read the pid from the pidfile
+ */
+static int get_pidf(arg_data *args) {
+ int fd;
+ int i;
+ char buff[80];
+
+ fd = open(args->pidf, O_RDONLY, 0);
+ log_debug("get_pidf: %d in %s", fd, args->pidf);
+ if (fd<0)
+ return(-1); /* something has gone wrong the JVM has stopped */
+ lockf(fd,F_LOCK,0);
+ i = read(fd,buff,sizeof(buff));
+ lockf(fd,F_ULOCK,0);
+ close(fd);
+ if (i>0) {
+ buff[i] = '\0';
+ i = atoi(buff);
+ log_debug("get_pidf: pid %d", i);
+ if (kill(i, 0)==0)
+ return(i);
+ }
+ return(-1);
+}
+
+/*
+ * Check temporatory file created by controller
+ * /tmp/pid.jsvc_up
+ */
+static int check_tmp_file(arg_data *args) {
+ int pid;
+ char buff[80];
+ int fd;
+ pid = get_pidf(args);
+ if (pid<0)
+ return(-1);
+ sprintf(buff,"/tmp/%d.jsvc_up", pid);
+ log_debug("check_tmp_file: %s", buff);
+ fd = open(buff, O_RDONLY);
+ if (fd<0)
+ return(-1);
+ close(fd);
+ return(0);
+}
+static void create_tmp_file(arg_data *args) {
+ char buff[80];
+ int fd;
+ sprintf(buff,"/tmp/%d.jsvc_up", getpid());
+ log_debug("create_tmp_file: %s", buff);
+ fd = open(buff, O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);
+ if (fd<0)
+ return;
+ close(fd);
+}
+static void remove_tmp_file(arg_data *args) {
+ char buff[80];
+ sprintf(buff,"/tmp/%d.jsvc_up", getpid());
+ log_debug("remove_tmp_file: %s", buff);
+ unlink(buff);
+}
+
+/*
+ * wait until jsvc create the I am ready file
+ * pid is the controller and args->pidf the JVM itself.
+ */
+static int wait_child(arg_data *args, int pid) {
+ int count=10;
+ bool havejvm=false;
+ int fd;
+ char buff[80];
+ int i;
+ log_debug("wait_child %d", pid);
+ while (count>0) {
+ /* check if the controler is still running */
+ if (kill(pid, 0)!=0)
+ return(1);
+ /* check if the pid file process exists */
+ fd = open(args->pidf, O_RDONLY);
+ if (fd<0 && havejvm)
+ return(1); /* something has gone wrong the JVM has stopped */
+ lockf(fd,F_LOCK,0);
+ i = read(fd,buff,sizeof(buff));
+ lockf(fd,F_ULOCK,0);
+ close(fd);
+ if (i>0) {
+ buff[i] = '\0';
+ i = atoi(buff);
+ if (kill(i, 0)==0) {
+ /* the JVM process has started */
+ havejvm=true;
+ if (check_tmp_file(args)==0)
+ return(0); /* ready JVM started */
+ }
+ }
+ sleep(6);
+ count--;
+ }
+ return(1);
+}
+
+/*
* son process logic.
*/
@@ -361,7 +462,9 @@
handler_int=signal_set(SIGINT,handler);
controlled = getpid();
log_debug("Waiting for a signal to be delivered");
+ create_tmp_file(args);
while (!stopping) sleep(60); /* pause() not threadsafe */
+ remove_tmp_file(args);
log_debug("Shutdown or reload requested: exiting");
/* Stop the service */
@@ -496,8 +599,13 @@
log_error("Cannot detach from parent process");
return(1);
}
- /* If we're in the parent process, we siply quit */
- if (pid!=0) return(0);
+ /* If we're in the parent process */
+ if (pid!=0) {
+ if (args->wait==true)
+ return(wait_child(args,pid));
+ else
+ return(0);
+ }
#ifndef NO_SETSID
setsid();
#endif
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org