bjh         99/06/06 00:15:24

  Added:       apr/threadproc/os2 Makefile.in proc.c signals.c thread.c
                        threadcancel.c threadpriv.c threadproc.h
  Log:
  Initial OS/2 thread/process library.
  
  Revision  Changes    Path
  1.1                  apache-apr/apr/threadproc/os2/Makefile.in
  
  Index: Makefile.in
  ===================================================================
  #CFLAGS=$(OPTIM) $(CFLAGS1) $(EXTRA_CFLAGS)
  #LIBS=$(EXTRA_LIBS) $(LIBS1)
  #INCLUDES=$(INCLUDES1) $(INCLUDES0) $(EXTRA_INCLUDES)
  #LDFLAGS=$(LDFLAGS1) $(EXTRA_LDFLAGS)
  
  [EMAIL PROTECTED]@
  [EMAIL PROTECTED]@
  [EMAIL PROTECTED]@ @CFLAGS@ @OPTIM@
  [EMAIL PROTECTED]@
  [EMAIL PROTECTED]@ $(LDLIBS)
  INCDIR=../../include
  INCDIR1=../../../include
  INCDIR2=../../file_io/os2
  INCLUDES=-I$(INCDIR) -I$(INCDIR1) -I$(INCDIR2) -I.
  
  LIB=../threadproc.a
  
  OBJS=proc.o \
        thread.o \
        threadcancel.o \
        threadpriv.o \
        signals.o
  
  .c.o:
        $(CC) $(CFLAGS) -c $(INCLUDES) $<
  
  all: $(LIB)
  
  clean:
        $(RM) -f *.o *.a *.so
  
  distclean: clean
        -$(RM) -f Makefile
  
  $(OBJS): Makefile
  
  $(LIB): $(OBJS)
        $(RM) -f $@
        $(AR) cr $@ $(OBJS)
        $(RANLIB) $@
  
  #
  # We really don't expect end users to use this rule.  It works only with
  # gcc, and rebuilds Makefile.tmpl.  You have to re-run Configure after
  # using it.
  #
  depend:
        cp Makefile.in Makefile.in.bak \
            && sed -ne '1,/^# DO NOT REMOVE/p' Makefile.in > Makefile.new \
            && gcc -MM $(INCLUDES) $(CFLAGS) *.c >> Makefile.new \
            && sed -e '1,$$s: $(INCDIR)/: $$(INCDIR)/:g' \
                   -e '1,$$s: $(OSDIR)/: $$(OSDIR)/:g' Makefile.new \
                > Makefile.in \
            && rm Makefile.new
  
  # DO NOT REMOVE
  proc.o: proc.c threadproc.h ../../../include/apr_thread_proc.h \
   ../../../include/apr_file_io.h ../../../include/apr_general.h \
   ../../../include/apr_errno.h ../../file_io/unix/fileio.h
  signals.o: signals.c threadproc.h ../../../include/apr_thread_proc.h \
   ../../../include/apr_file_io.h ../../../include/apr_general.h \
   ../../../include/apr_errno.h ../../file_io/unix/fileio.h
  thread.o: thread.c threadproc.h ../../../include/apr_thread_proc.h \
   ../../../include/apr_file_io.h ../../../include/apr_general.h \
   ../../../include/apr_errno.h
  threadcancel.o: threadcancel.c threadproc.h \
   ../../../include/apr_thread_proc.h ../../../include/apr_file_io.h \
   ../../../include/apr_general.h ../../../include/apr_errno.h
  threadpriv.o: threadpriv.c threadproc.h \
   ../../../include/apr_thread_proc.h ../../../include/apr_file_io.h \
   ../../../include/apr_general.h ../../../include/apr_errno.h
  
  
  
  1.1                  apache-apr/apr/threadproc/os2/proc.c
  
  Index: proc.c
  ===================================================================
  /* ====================================================================
   * Copyright (c) 1999 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * 4. The names "Apache Server" and "Apache Group" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For written permission, please contact
   *    [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Group.
   * For more information on the Apache Group and the Apache HTTP server
   * project, please see <http://www.apache.org/>.
   *
   */
  
  #include "threadproc.h"
  #include "fileio.h"
  
  #include "apr_thread_proc.h"
  #include "apr_file_io.h"
  #include "apr_general.h"
  #include "apr_lib.h"
  #include <signal.h>
  #include <string.h>
  #include <sys/wait.h>
  #include <unistd.h>
  #define INCL_DOS
  #include <os2.h>
  
  ap_status_t ap_createprocattr_init(ap_context_t *cont, struct procattr_t 
**new)
  {
      (*new) = (struct procattr_t *)ap_palloc(cont, 
                sizeof(struct procattr_t));
  
      if ((*new) == NULL) {
          return APR_ENOMEM;
      }
      (*new)->cntxt = cont;
      (*new)->parent_in = NULL;
      (*new)->child_in = NULL;
      (*new)->parent_out = NULL;
      (*new)->child_out = NULL;
      (*new)->parent_err = NULL;
      (*new)->child_err = NULL;
      (*new)->currdir = NULL; 
      (*new)->cmdtype = APR_PROGRAM;
      return APR_SUCCESS;
  }
  
  ap_status_t ap_setprocattr_io(struct procattr_t *attr, ap_int32_t in, 
                                   ap_int32_t out, ap_int32_t err)
  {
      ap_status_t stat;
      if (in) {
          if ((stat = ap_create_pipe(attr->cntxt, &attr->child_in, 
                              &attr->parent_in)) != APR_SUCCESS) {
              return stat;
          }
      } 
      if (out) {
          if ((stat = ap_create_pipe(attr->cntxt, &attr->parent_out, 
                              &attr->child_out)) != APR_SUCCESS) {
              return stat;
          }
      } 
      if (err) {
          if ((stat = ap_create_pipe(attr->cntxt, &attr->parent_err, 
                              &attr->child_err)) != APR_SUCCESS) {
              return stat;
          }
      } 
      return APR_SUCCESS;
  }
  
  ap_status_t ap_setprocattr_dir(struct procattr_t *attr, 
                                   char *dir) 
  {
      attr->currdir = ap_pstrdup(attr->cntxt, dir);
      if (attr->currdir) {
          return APR_SUCCESS;
      }
      return APR_ENOMEM;
  }
  
  ap_status_t ap_setprocattr_cmdtype(struct procattr_t *attr,
                                       ap_cmdtype_e cmd) 
  {
      attr->cmdtype = cmd;
      return APR_SUCCESS;
  }
  
  ap_status_t ap_fork(ap_context_t *cont, struct proc_t **proc)
  {
      int pid;
      
      (*proc) = ap_palloc(cont, sizeof(struct proc_t));
  
      if ((pid = fork()) < 0) {
          return errno;
      }
      else if (pid == 0) {
          (*proc)->pid = pid;
          (*proc)->attr = NULL;
          return APR_INCHILD;
      }
      (*proc)->pid = pid;
      (*proc)->attr = NULL;
      return APR_INPARENT;
  }
  
  ap_status_t ap_create_process(ap_context_t *cont, char *progname,
                                char *const args[], char **env,
                                struct procattr_t *attr, struct proc_t **new)
  {
      int i;
      char **newargs;
      char savedir[300];
      HFILE save_in, save_out, save_err, dup;
      int criticalsection = FALSE;
  
      (*new) = (struct proc_t *)ap_palloc(cont, sizeof(struct proc_t));
  
      if ((*new) == NULL) {
          return APR_ENOMEM;
      }
  
      (*new)->cntxt = cont;
      
  /* Prevent other threads from running while these process-wide resources are 
modified */
      if (attr->child_in || attr->child_out || attr->child_err || 
attr->currdir) {
          criticalsection = TRUE;
          DosEnterCritSec();
      }
  
      if (attr->child_in) {
          save_in = -1;
          DosDupHandle(STDIN_FILENO, &save_in);
          dup = STDIN_FILENO;
          DosDupHandle(attr->child_in->filedes, &dup);
          DosSetFHState(attr->parent_in->filedes, OPEN_FLAGS_NOINHERIT);
      }
      
      if (attr->child_out) {
          save_out = -1;
          DosDupHandle(STDOUT_FILENO, &save_out);
          dup = STDOUT_FILENO;
          DosDupHandle(attr->child_out->filedes, &dup);
          DosSetFHState(attr->parent_out->filedes, OPEN_FLAGS_NOINHERIT);
      }
      
      if (attr->child_err) {
          save_err = -1;
          DosDupHandle(STDERR_FILENO, &save_err);
          dup = STDERR_FILENO;
          DosDupHandle(attr->child_err->filedes, &dup);
          DosSetFHState(attr->parent_err->filedes, OPEN_FLAGS_NOINHERIT);
      }
  
      signal(SIGCHLD, SIG_DFL); /*not sure if this is needed or not */
  
      if (attr->currdir != NULL) {
          _getcwd2(savedir, sizeof(savedir));
          
          if (_chdir2(attr->currdir) < 0) {
              if (criticalsection)
                  DosExitCritSec();
              return errno;
          }
      }
  
      if (attr->cmdtype == APR_SHELLCMD) {
          i = 0;
          while (args[i]) {
              i++;
          }
          newargs = (char **)ap_palloc(cont, sizeof (char *) * (i + 3));
          newargs[0] = ap_pstrdup(cont, SHELL_PATH);
          newargs[1] = ap_pstrdup(cont, "/c");
          i = 0;
  
          while (args[i]) {
              newargs[i + 2] = ap_pstrdup(cont, args[i]);
              i++;
          }
  
          newargs[i + 3] = NULL;
          (*new)->pid = spawnve(P_NOWAIT, SHELL_PATH, newargs, env);
      } else {
          (*new)->pid = spawnve(P_NOWAIT, progname, args, env);
      }
      
      if (attr->currdir != NULL) {
          chdir(savedir);
      }
  
      if (attr->child_in) {
          ap_close(attr->child_in);
          dup = STDIN_FILENO;
          DosDupHandle(save_in, &dup);
          DosClose(save_in);
      }
      if (attr->child_out) {
          ap_close(attr->child_out);
          dup = STDOUT_FILENO;
          DosDupHandle(save_out, &dup);
          DosClose(save_out);
      }
      if (attr->child_err) {
          ap_close(attr->child_err);
          dup = STDERR_FILENO;
          DosDupHandle(save_err, &dup);
          DosClose(save_err);
      }
  
      if (criticalsection)
          DosExitCritSec();
  
      (*new)->attr = attr;
      return APR_SUCCESS;
  }
  
  ap_status_t ap_get_childin(struct proc_t *proc, ap_file_t **new)
  {
      (*new) = proc->attr->parent_in;
      return APR_SUCCESS; 
  }
  
  ap_status_t ap_get_childout(struct proc_t *proc, ap_file_t **new)
  {
      (*new) = proc->attr->parent_out; 
      return APR_SUCCESS;
  }
  
  ap_status_t ap_get_childerr(struct proc_t *proc, ap_file_t **new)
  {
      (*new) = proc->attr->parent_err; 
      return APR_SUCCESS;
  }    
  
  ap_status_t ap_wait_proc(struct proc_t *proc, 
                             ap_wait_how_e wait)
  {
      pid_t stat;
  
      if (!proc)
          return APR_ENOPROC;
  
      if (wait == APR_WAIT) {
          if ((stat = waitpid(proc->pid, NULL, WUNTRACED)) > 0) {
              return APR_CHILD_DONE;
          } else if (stat == 0) {
              return APR_CHILD_NOTDONE;
          }
          return errno;
      }
  
      if ((stat = waitpid(proc->pid, NULL, WUNTRACED | WNOHANG)) > 0) {
          return APR_CHILD_DONE;
      } else if (stat == 0) {
          return APR_CHILD_NOTDONE;
      }
  
      return errno;
  } 
  
  
  
  
  1.1                  apache-apr/apr/threadproc/os2/signals.c
  
  Index: signals.c
  ===================================================================
  /* ====================================================================
   * Copyright (c) 1999 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * 4. The names "Apache Server" and "Apache Group" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For written permission, please contact
   *    [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Group.
   * For more information on the Apache Group and the Apache HTTP server
   * project, please see <http://www.apache.org/>.
   *
   */
  
  #include "threadproc.h"
  #include "fileio.h"
  #include "apr_thread_proc.h"
  #include "apr_file_io.h"
  #include "apr_general.h"
  #include <signal.h>
  #include <string.h>
  #include <sys/wait.h>
  #define INCL_DOS
  #include <os2.h>
  
  ap_status_t ap_kill(struct proc_t *proc, int signal)
  {
  /* SIGTERM's don't work too well in OS/2 (only affects other EMX programs).
     CGIs may not be, esp. REXX scripts, so use a native call instead */
     
      ap_status_t rc;
      
      if ( signal == SIGTERM ) {
          rc = os2errno(DosSendSignalException(proc->pid, XCPT_SIGNAL_BREAK));
      } else {
          rc = kill(proc->pid, signal) < 0 ? errno : APR_SUCCESS;
      }
      
      return rc;
  }
  
  
  
  
  1.1                  apache-apr/apr/threadproc/os2/thread.c
  
  Index: thread.c
  ===================================================================
  /* ====================================================================
   * Copyright (c) 1999 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * 4. The names "Apache Server" and "Apache Group" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For written permission, please contact
   *    [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Group.
   * For more information on the Apache Group and the Apache HTTP server
   * project, please see <http://www.apache.org/>.
   *
   */
  
  #include "threadproc.h"
  #include "apr_thread_proc.h"
  #include "apr_general.h"
  #include "apr_lib.h"
  #include "fileio.h"
  #define INCL_DOS
  #include <os2.h>
  
  ap_status_t ap_create_threadattr(ap_context_t *cont, struct threadattr_t 
**new)
  {
      (*new) = (struct threadattr_t *)ap_palloc(cont, sizeof(struct 
threadattr_t));
  
      if ((*new) == NULL) {
          return APR_ENOMEM;
      }
  
      (*new)->cntxt = cont;
      (*new)->attr = 0;
      return APR_SUCCESS;
  }
  
  
  
  ap_status_t ap_setthreadattr_detach(struct threadattr_t *attr, ap_int32_t on)
  {
      attr->attr |= APR_THREADATTR_DETACHED;
      return APR_SUCCESS;
  }
  
  
  
  ap_status_t ap_getthreadattr_detach(struct threadattr_t *attr)
  {
      return (attr->attr & APR_THREADATTR_DETACHED) ? APR_DETACH : 
APR_NOTDETACH;
  }
  
  
  
  static void ap_thread_begin(void *arg)
  {
    struct thread_t *thread = (struct thread_t *)arg;
    thread->rv = thread->func(thread->data);
  }
  
  
  
  ap_status_t ap_create_thread(ap_context_t *cont, struct threadattr_t *attr, 
                               ap_thread_start_t func, void *data, 
                               struct thread_t **new)
  {
      ap_status_t stat;
      ap_thread_t *thread;
   
      thread = (struct thread_t *)ap_palloc(cont, sizeof(struct thread_t));
      *new = thread;
  
      if (thread == NULL) {
          return APR_ENOMEM;
      }
  
      thread->cntxt = cont;
      thread->attr = attr;
      thread->func = func;
      thread->data = data;
      stat = ap_create_context(cont, NULL, &thread->cntxt);
      
      if (stat != APR_SUCCESS) {
          return stat;
      }
  
      if (attr == NULL) {
          stat = ap_create_threadattr(thread->cntxt, &thread->attr);
          
          if (stat != APR_SUCCESS) {
              return stat;
          }
      }
      
      if (thread->attr->attr & APR_THREADATTR_DETACHED)
          thread->tid = _beginthread((os2_thread_start_t)func, NULL, 
APR_THREAD_STACKSIZE, data);
      else
          thread->tid = _beginthread(ap_thread_begin, NULL, 
APR_THREAD_STACKSIZE, thread);
          
      if (thread->tid < 0) {
          return errno;
      }
  
      return APR_SUCCESS;
  }
  
  
  
  ap_status_t ap_thread_exit(ap_thread_t *thd, ap_status_t *retval)
  {
      thd->rv = retval;
      _endthread();
      return -1; /* If we get here something's wrong */
  }
  
  
  
  ap_status_t ap_thread_join(struct thread_t *thd, ap_status_t *retval)
  {
      ULONG rc;
      TID waittid = thd->tid;
  
      if (thd->attr->attr & APR_THREADATTR_DETACHED)
          return APR_ENOSTAT;
  
      rc = DosWaitThread(&waittid, DCWW_WAIT);
      *retval = (ap_status_t)thd->rv;
      return os2errno(rc);
  }
  
  
  
  ap_status_t ap_thread_detach(struct thread_t *thd)
  {
      thd->attr->attr |= APR_THREADATTR_DETACHED;
      return APR_SUCCESS;
  }
  
  
  
  
  
  1.1                  apache-apr/apr/threadproc/os2/threadcancel.c
  
  Index: threadcancel.c
  ===================================================================
  /* ====================================================================
   * Copyright (c) 1999 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * 4. The names "Apache Server" and "Apache Group" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For written permission, please contact
   *    [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Group.
   * For more information on the Apache Group and the Apache HTTP server
   * project, please see <http://www.apache.org/>.
   *
   */
  
  #include "threadproc.h"
  #include "apr_thread_proc.h"
  #include "apr_general.h"
  #include "fileio.h"
  
  ap_status_t ap_cancel_thread(struct thread_t *thd)
  {
      return os2errno(DosKillThread(thd->tid));
  }
  
      
  
  ap_status_t ap_setcanceltype(ap_context_t *cont, ap_int32_t type)
  {
      ULONG rc, nesting;
  
      if (type == APR_CANCEL_DEFER)
          rc = DosEnterMustComplete(&nesting);
      else
          rc = DosExitMustComplete(&nesting);
  
      return os2errno(rc);
  }
  
  
  
  ap_status_t ap_setcancelstate(ap_context_t *cont, ap_int32_t type)
  {
  /* There's no way to ignore thread kills altogether in OS/2 (that I know of) 
*/
      return -1;
  }
  
  
  
  1.1                  apache-apr/apr/threadproc/os2/threadpriv.c
  
  Index: threadpriv.c
  ===================================================================
  /* ====================================================================
   * Copyright (c) 1999 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * 4. The names "Apache Server" and "Apache Group" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For written permission, please contact
   *    [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Group.
   * For more information on the Apache Group and the Apache HTTP server
   * project, please see <http://www.apache.org/>.
   *
   */
  
  #include "threadproc.h"
  #include "apr_thread_proc.h"
  #include "apr_general.h"
  #include "apr_errno.h"
  #include "apr_lib.h"
  #include "fileio.h"
  
  ap_status_t ap_create_thread_private(ap_context_t *cont, void (*dest)(void *),
                                       struct threadkey_t **key)
  {
      (*key) = (struct threadkey_t *)ap_palloc(cont, sizeof(struct 
threadkey_t));
  
      if ((*key) == NULL) {
          return APR_ENOMEM;
      }
  
      (*key)->cntxt = cont;
      return os2errno(DosAllocThreadLocalMemory(1, &((*key)->key)));
  }
  
  ap_status_t ap_get_thread_private(struct threadkey_t *key, void **new)
  {
      (*new) = (void *)*(key->key);
      return APR_SUCCESS;
  }
  
  ap_status_t ap_set_thread_private(struct threadkey_t *key, void *priv)
  {
      *(key->key) = (ULONG)priv;
      return APR_SUCCESS;
  }
  
  ap_status_t ap_delete_thread_private(struct threadkey_t *key)
  {
      return os2errno(DosFreeThreadLocalMemory(key->key));
  }
  
  
  
  
  1.1                  apache-apr/apr/threadproc/os2/threadproc.h
  
  Index: threadproc.h
  ===================================================================
  /* ====================================================================
   * Copyright (c) 1999 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * 4. The names "Apache Server" and "Apache Group" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For written permission, please contact
   *    [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Group.
   * For more information on the Apache Group and the Apache HTTP server
   * project, please see <http://www.apache.org/>.
   *
   */
  
  #include "apr_thread_proc.h"
  #include "apr_file_io.h"
  
  #ifndef THREAD_PROC_H
  #define THREAD_PROC_H
  
  #define APR_THREADATTR_DETACHED 1
  
  #define SHELL_PATH "cmd.exe"
  #define APR_THREAD_STACKSIZE 65536
  
  struct threadattr_t {
      ap_context_t *cntxt;
      unsigned long attr;
  };
  
  struct thread_t {
      ap_context_t *cntxt;
      struct threadattr_t *attr;
      unsigned long tid;
      ap_thread_start_t func;
      void *data;
      void *rv;
  };
  
  struct threadkey_t {
      ap_context_t *cntxt;
      unsigned long *key;
  };
  
  struct procattr_t {
      ap_context_t *cntxt;
      ap_file_t *parent_in;
      ap_file_t *child_in;
      ap_file_t *parent_out;
      ap_file_t *child_out;
      ap_file_t *parent_err;
      ap_file_t *child_err;
      char *currdir;
      ap_int32_t cmdtype;
  };
  
  struct proc_t {
      ap_context_t *cntxt;
      pid_t pid;
      struct procattr_t *attr;
  };
  
  typedef void (*os2_thread_start_t)(void *);
  
  #endif  /* ! THREAD_PROC_H */
  
  
  
  

Reply via email to