diff options
Diffstat (limited to 'threadproc/os2')
-rw-r--r-- | threadproc/os2/Makefile.in | 71 | ||||
-rw-r--r-- | threadproc/os2/proc.c | 321 | ||||
-rw-r--r-- | threadproc/os2/signals.c | 82 | ||||
-rw-r--r-- | threadproc/os2/thread.c | 178 | ||||
-rw-r--r-- | threadproc/os2/threadcancel.c | 86 | ||||
-rw-r--r-- | threadproc/os2/threadpriv.c | 92 | ||||
-rw-r--r-- | threadproc/os2/threadproc.h | 108 |
7 files changed, 938 insertions, 0 deletions
diff --git a/threadproc/os2/Makefile.in b/threadproc/os2/Makefile.in new file mode 100644 index 000000000..91d4249c2 --- /dev/null +++ b/threadproc/os2/Makefile.in @@ -0,0 +1,71 @@ +#CFLAGS=$(OPTIM) $(CFLAGS1) $(EXTRA_CFLAGS) +#LIBS=$(EXTRA_LIBS) $(LIBS1) +#INCLUDES=$(INCLUDES1) $(INCLUDES0) $(EXTRA_INCLUDES) +#LDFLAGS=$(LDFLAGS1) $(EXTRA_LDFLAGS) + +CC=@CC@ +RANLIB=@RANLIB@ +CFLAGS=@CFLAGS@ @OPTIM@ +LIBS=@LIBS@ +LDFLAGS=@LDFLAGS@ $(LIBS) +INCDIR=../../inc +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 diff --git a/threadproc/os2/proc.c b/threadproc/os2/proc.c new file mode 100644 index 000000000..5767d898c --- /dev/null +++ b/threadproc/os2/proc.c @@ -0,0 +1,321 @@ +/* ==================================================================== + * 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 + * apache@apache.org. + * + * 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; + (*proc)->running = TRUE; + return APR_INCHILD; + } + + (*proc)->pid = pid; + (*proc)->attr = NULL; + (*proc)->running = TRUE; + 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; + ap_status_t stat; + 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; + (*new)->running = FALSE; + +/* 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); + } + + stat = (*new)->pid < 0 ? errno : APR_SUCCESS; + + 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; + (*new)->running = stat == APR_SUCCESS; + return stat; +} + + + +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 (!proc->running) + return APR_CHILD_DONE; + + if (wait == APR_WAIT) { + if ((stat = waitpid(proc->pid, NULL, WUNTRACED)) > 0) { + proc->running = FALSE; + return APR_CHILD_DONE; + } else if (stat == 0) { + return APR_CHILD_NOTDONE; + } + return errno; + } + + if ((stat = waitpid(proc->pid, NULL, WUNTRACED | WNOHANG)) > 0) { + proc->running = FALSE; + return APR_CHILD_DONE; + } else if (stat == 0) { + return APR_CHILD_NOTDONE; + } + + return errno; +} + diff --git a/threadproc/os2/signals.c b/threadproc/os2/signals.c new file mode 100644 index 000000000..d0014f695 --- /dev/null +++ b/threadproc/os2/signals.c @@ -0,0 +1,82 @@ +/* ==================================================================== + * 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 + * apache@apache.org. + * + * 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; +} + diff --git a/threadproc/os2/thread.c b/threadproc/os2/thread.c new file mode 100644 index 000000000..14cf980c5 --- /dev/null +++ b/threadproc/os2/thread.c @@ -0,0 +1,178 @@ +/* ==================================================================== + * 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 + * apache@apache.org. + * + * 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; +} + + diff --git a/threadproc/os2/threadcancel.c b/threadproc/os2/threadcancel.c new file mode 100644 index 000000000..5f4766bc5 --- /dev/null +++ b/threadproc/os2/threadcancel.c @@ -0,0 +1,86 @@ +/* ==================================================================== + * 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 + * apache@apache.org. + * + * 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; +} diff --git a/threadproc/os2/threadpriv.c b/threadproc/os2/threadpriv.c new file mode 100644 index 000000000..049f93896 --- /dev/null +++ b/threadproc/os2/threadpriv.c @@ -0,0 +1,92 @@ +/* ==================================================================== + * 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 + * apache@apache.org. + * + * 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)); +} + diff --git a/threadproc/os2/threadproc.h b/threadproc/os2/threadproc.h new file mode 100644 index 000000000..215a7f9fd --- /dev/null +++ b/threadproc/os2/threadproc.h @@ -0,0 +1,108 @@ +/* ==================================================================== + * 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 + * apache@apache.org. + * + * 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; + int running; +}; + +typedef void (*os2_thread_start_t)(void *); + +#endif /* ! THREAD_PROC_H */ + |