bjh         99/04/08 04:36:39

  Modified:    src/include ap_config.h
               src/main alloc.c util_script.c
               src/modules/standard mod_cgi.c mod_include.c
               src      CHANGES
  Log:
  OS/2: Rework CGI handling to use spawn*() instead of fork/exec, achieving
  a roughly 5 fold speed up. Forking really sucks performance wise on OS/2
  as it isn't supported by the kernal but fudged in the C libraries for
  unix compatibility.
  
  Revision  Changes    Path
  1.253     +1 -0      apache-1.3/src/include/ap_config.h
  
  Index: ap_config.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/include/ap_config.h,v
  retrieving revision 1.252
  retrieving revision 1.253
  diff -u -r1.252 -r1.253
  --- ap_config.h       1999/03/16 16:16:07     1.252
  +++ ap_config.h       1999/04/08 11:36:32     1.253
  @@ -746,6 +746,7 @@
   #define NO_KILLPG
   #define NEED_STRCASECMP
   #define NEED_STRNCASECMP
  +#define NEED_PROCESS_H
   #define NO_SETSID
   #define NO_TIMES
   #define CASE_BLIND_FILESYSTEM
  
  
  
  1.107     +50 -2     apache-1.3/src/main/alloc.c
  
  Index: alloc.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/alloc.c,v
  retrieving revision 1.106
  retrieving revision 1.107
  diff -u -r1.106 -r1.107
  --- alloc.c   1999/03/07 14:05:34     1.106
  +++ alloc.c   1999/04/08 11:36:33     1.107
  @@ -1671,9 +1671,9 @@
   
   API_EXPORT(void) ap_cleanup_for_exec(void)
   {
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(OS2)
       /*
  -     * Don't need to do anything on NT, because I
  +     * Don't need to do anything on NT or OS/2, because I
        * am actually going to spawn the new process - not
        * exec it. All handles that are not inheritable, will
        * be automajically closed. The only problem is with
  @@ -2140,6 +2140,54 @@
         * unblock alarms and return the pid
         */
   
  +    }
  +#elif defined(OS2)
  +    {
  +        int save_in=-1, save_out=-1, save_err=-1;
  +        
  +        if (pipe_out) {
  +            save_out = dup(STDOUT_FILENO);
  +            dup2(out_fds[1], STDOUT_FILENO);
  +            close(out_fds[1]);
  +        }
  +
  +        if (pipe_in) {
  +            save_in = dup(STDIN_FILENO);
  +            dup2(in_fds[0], STDIN_FILENO);
  +            close(in_fds[0]);
  +        }
  +
  +        if (pipe_err) {
  +            save_err = dup(STDERR_FILENO);
  +            dup2(err_fds[1], STDERR_FILENO);
  +            close(err_fds[1]);
  +        }
  +    
  +        pid = func(data, NULL);
  +    
  +        if ( pid )
  +            ap_note_subprocess(p, pid, kill_how);
  +
  +        if (pipe_out) {
  +            close(STDOUT_FILENO);
  +            dup2(save_out, STDOUT_FILENO);
  +            close(save_out);
  +            *pipe_out = out_fds[0];
  +        }
  +
  +        if (pipe_in) {
  +            close(STDIN_FILENO);
  +            dup2(save_in, STDIN_FILENO);
  +            close(save_in);
  +            *pipe_in = in_fds[1];
  +        }
  +
  +        if (pipe_err) {
  +            close(STDERR_FILENO);
  +            dup2(save_err, STDERR_FILENO);
  +            close(save_err);
  +            *pipe_err = err_fds[0];
  +        }
       }
   #else
   
  
  
  
  1.140     +8 -30     apache-1.3/src/main/util_script.c
  
  Index: util_script.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/main/util_script.c,v
  retrieving revision 1.139
  retrieving revision 1.140
  diff -u -r1.139 -r1.140
  --- util_script.c     1999/03/10 18:09:44     1.139
  +++ util_script.c     1999/04/08 11:36:33     1.140
  @@ -695,7 +695,7 @@
   
   #endif
   
  -#ifndef WIN32
  +#if !defined(WIN32) && !defined(OS2)
       /* the fd on r->server->error_log is closed, but we need somewhere to
        * put the error messages from the log_* functions. So, we use stderr,
        * since that is better than allowing errors to go unnoticed.  Don't do
  @@ -770,52 +770,30 @@
        }
   
        if ((!r->args) || (!r->args[0]) || strchr(r->args, '=')) {
  -         int emxloop;
  -         char *emxtemp;
  -
  -         /* For OS/2 place the variables in the current
  -          * environment then it will be inherited. This way
  -          * the program will also get all of OS/2's other SETs.
  -          */
  -         for (emxloop = 0; ((emxtemp = env[emxloop]) != NULL); emxloop++) {
  -             putenv(emxtemp);
  -         }
  -
            /* More additions by Alec Kloss for OS/2 */
            if (is_script) {
                /* here's the stuff to run the interpreter */
  -             execl(interpreter + 2, interpreter + 2, r->filename, NULL);
  +             pid = spawnle(P_NOWAIT, interpreter + 2, interpreter + 2, 
r->filename, NULL, env);
            }
            else if (strstr(strupr(r->filename), ".CMD") > 0) {
                /* Special case to allow use of REXX commands as scripts. */
                os2pathname(r->filename);
  -             execl(SHELL_PATH, SHELL_PATH, "/C", r->filename, NULL);
  +             pid = spawnle(P_NOWAIT, SHELL_PATH, SHELL_PATH, "/C", 
r->filename, NULL, env);
            }
            else {
  -             execl(r->filename, argv0, NULL);
  +             pid = spawnle(P_NOWAIT, r->filename, argv0, NULL, env);
            }
        }
        else {
  -         int emxloop;
  -         char *emxtemp;
  -
  -         /* For OS/2 place the variables in the current
  -          * environment so that they will be inherited. This way
  -          * the program will also get all of OS/2's other SETs.
  -          */
  -         for (emxloop = 0; ((emxtemp = env[emxloop]) != NULL); emxloop++) {
  -             putenv(emxtemp);
  -         }
  -
            if (strstr(strupr(r->filename), ".CMD") > 0) {
                /* Special case to allow use of REXX commands as scripts. */
                os2pathname(r->filename);
  -             execv(SHELL_PATH, create_argv_cmd(r->pool, argv0, r->args,
  -                                               r->filename));
  +             pid = spawnve(P_NOWAIT, SHELL_PATH, create_argv_cmd(r->pool, 
argv0, r->args,
  +                                               r->filename), env);
            }
            else {
  -             execv(r->filename,
  -                   create_argv(r->pool, NULL, NULL, NULL, argv0, r->args));
  +             pid = spawnve(P_NOWAIT, r->filename,
  +                   create_argv(r->pool, NULL, NULL, NULL, argv0, r->args), 
env);
            }
        }
        return (pid);
  
  
  
  1.90      +1 -1      apache-1.3/src/modules/standard/mod_cgi.c
  
  Index: mod_cgi.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_cgi.c,v
  retrieving revision 1.89
  retrieving revision 1.90
  diff -u -r1.89 -r1.90
  --- mod_cgi.c 1999/03/08 15:44:04     1.89
  +++ mod_cgi.c 1999/04/08 11:36:34     1.90
  @@ -328,7 +328,7 @@
       ap_cleanup_for_exec();
   
       child_pid = ap_call_exec(r, pinfo, argv0, env, 0);
  -#ifdef WIN32
  +#if defined(WIN32) || defined(OS2)
       return (child_pid);
   #else
   
  
  
  
  1.112     +1 -1      apache-1.3/src/modules/standard/mod_include.c
  
  Index: mod_include.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_include.c,v
  retrieving revision 1.111
  retrieving revision 1.112
  diff -u -r1.111 -r1.112
  --- mod_include.c     1999/03/07 13:13:54     1.111
  +++ mod_include.c     1999/04/08 11:36:36     1.112
  @@ -822,7 +822,7 @@
       /* set shellcmd flag to pass arg to SHELL_PATH */
       child_pid = ap_call_exec(r, pinfo, s, ap_create_environment(r->pool, 
env),
                             1);
  -#ifdef WIN32
  +#if defined(WIN32) || defined(OS2)
       return (child_pid);
   #else
       /* Oh, drat.  We're still here.  The log file descriptors are closed,
  
  
  
  1.1299    +2 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1298
  retrieving revision 1.1299
  diff -u -r1.1298 -r1.1299
  --- CHANGES   1999/04/07 14:31:19     1.1298
  +++ CHANGES   1999/04/08 11:36:37     1.1299
  @@ -1,4 +1,6 @@
   Changes with Apache 1.3.7
  +  *) OS/2: Rework CGI handling to use spawn*() instead of fork/exec, 
achieving
  +     a roughly 5 fold speed up. [Brian Havard]
   
     *) proxy ftp: instead of using the hardwired string "text/plain" as
        a fallback type for files served by the ftp proxy, use the
  
  
  

Reply via email to