You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by rb...@hyperreal.org on 1999/05/17 20:46:49 UTC
cvs commit: apache-apr/apr/threadproc/beos proc.c signals.c thread.c threadcancel.c threadpriv.c threadproc.h
rbb 99/05/17 11:46:48
Added: apr/threadproc/beos proc.c signals.c thread.c threadcancel.c
threadpriv.c threadproc.h
Log:
Initial implementation of BeOS thread/process functions
Submitted by: David Reid
Revision Changes Path
1.1 apache-apr/apr/threadproc/beos/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
* 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 <signal.h>
#include <string.h>
#include <sys/wait.h>
#include "threadproc.h"
#include "apr_thread_proc.h"
#include "apr_file_io.h"
#include "apr_general.h"
ap_procattr_t *ap_createprocattr_init(ap_context_t *cont)
{
ap_procattr_t *new = (ap_procattr_t *)ap_palloc(cont->pool, sizeof(ap_procattr_t));
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 new;
}
ap_status_t ap_setprocattr_io(ap_context_t *cont, struct procattr_t *attr, ap_int32_t in,
ap_int32_t out, ap_int32_t err)
{
if (in) {
attr->parent_in = (ap_file_t *)ap_palloc(cont->pool,
sizeof(ap_file_t));
attr->child_in = (ap_file_t *)ap_palloc(cont->pool,
sizeof(ap_file_t));
if (ap_create_pipe(cont, attr->child_in,
attr->parent_in) == APR_FAILURE) {
return APR_FAILURE;
}
}
if (out) {
attr->parent_out = (ap_file_t *)ap_palloc(cont->pool,
sizeof(ap_file_t));
attr->child_out = (ap_file_t *)ap_palloc(cont->pool,
sizeof(ap_file_t));
if (ap_create_pipe(cont, attr->parent_out,
attr->child_out) == APR_FAILURE) {
return APR_FAILURE;
}
}
if (err) {
attr->parent_err = (ap_file_t *)ap_palloc(cont->pool,
sizeof(ap_file_t));
attr->child_err = (ap_file_t *)ap_palloc(cont->pool,
sizeof(ap_file_t));
if (ap_create_pipe(cont, attr->parent_err,
attr->child_err) == APR_FAILURE) {
return APR_FAILURE;
}
}
}
ap_status_t ap_setprocattr_dir(ap_context_t *cont, struct procattr_t *attr,
char *dir)
{
attr->currdir = strdup(dir);
}
ap_status_t ap_setprocattr_cmdtype(ap_context_t *cont, struct procattr_t *attr,
ap_cmdtype_e cmd)
{
attr->cmdtype = cmd;
}
ap_int32_t ap_fork(ap_context_t *cont, struct proc_t *proc)
{
int pid;
if ((pid = fork()) < 0) {
return -1;
}
else if (pid == 0) {
proc->pid = pid;
proc->attr = NULL;
return pid;
}
proc->pid = pid;
proc->attr = NULL;
return 1;
}
ap_proc_t *ap_create_process(ap_context_t *cont, char *progname,
char *const args[], char **env,
struct procattr_t *attr)
{
struct proc_t *new = (struct proc_t *)ap_palloc(cont->pool, sizeof(struct proc_t));
int i;
char **newargs;
if ((new->pid = fork()) < 0) {
return NULL;
}
else if (new->pid == 0) {
/* child process */
if (attr->child_in) {
ap_close(cont, attr->parent_in);
dup2(attr->child_in->filedes, STDIN_FILENO);
ap_close(cont, attr->child_in);
}
if (attr->child_out) {
ap_close(cont, attr->parent_out);
dup2(attr->child_out->filedes, STDOUT_FILENO);
ap_close(cont, attr->child_out);
}
if (attr->child_err) {
ap_close(cont, attr->parent_err);
dup2(attr->child_err->filedes, STDERR_FILENO);
ap_close(cont, attr->child_err);
}
signal(SIGCHLD, SIG_DFL); /*not sure if this is needed or not */
if (attr->currdir != NULL) {
if (chdir(attr->currdir) == -1) {
free(new);
exit(-1); /* We have big problems, the child should exit. */
}
}
if (attr->cmdtype == APR_SHELLCMD) {
i = 0;
while (args[i]) {
i++;
}
newargs = (char **)malloc(sizeof (char *) * (i + 3));
newargs[0] = strdup(SHELL_PATH);
newargs[1] = strdup("-c");
i = 0;
while (args[i]) {
newargs[i + 2] = strdup(args[i]);
i++;
}
newargs[i + 3] = NULL;
execve(SHELL_PATH, newargs, env);
}
else {
execve(progname, args, env);
}
exit(-1); /* if we get here, there is a problem, so exit with an */
/* error code. */
}
/* Parent process */
if (attr->child_in) {
ap_close(cont, attr->child_in);
}
if (attr->child_out) {
ap_close(cont, attr->child_out);
}
if (attr->child_err) {
ap_close(cont, attr->child_err);
}
new->attr = attr;
return new;
}
ap_file_t *ap_get_childin(ap_context_t *cont, struct proc_t *proc)
{
return proc->attr->parent_in;
}
ap_file_t *ap_get_childout(ap_context_t *cont, struct proc_t *proc)
{
return proc->attr->parent_out;
}
ap_file_t *ap_get_childerr(ap_context_t *cont, struct proc_t *proc)
{
return proc->attr->parent_err;
}
ap_status_t ap_wait_proc(ap_context_t *cont, struct proc_t *proc,
ap_wait_how_e wait)
{
if (!proc)
return APR_FAILURE;
if (wait == APR_WAIT) {
if (waitpid(proc->pid, NULL, WUNTRACED) > 0)
return APR_SUCCESS;
return APR_FAILURE;
}
if (waitpid(proc->pid, NULL, WUNTRACED | WNOHANG) > 0)
return APR_SUCCESS;
return APR_FAILURE;
}
void ap_exit_proc(ap_context_t *cont)
{
ap_destroy_pool(cont->pool);
}
1.1 apache-apr/apr/threadproc/beos/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
* 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>
void ap_kill(struct proc_t *proc, int signal)
{
kill(proc->pid, signal);
}
1.1 apache-apr/apr/threadproc/beos/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
* 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"
struct threadattr_t *ap_create_threadattr(ap_context_t *cont)
{
struct threadattr_t *new;
new = (struct threadattr_t *)ap_palloc(cont->pool, sizeof(struct threadattr_t));
new->attr = (int32)ap_palloc(cont->pool, sizeof(int32));
new->attr = (int32)B_NORMAL_PRIORITY;
}
ap_status_t ap_setthreadattr_detach(ap_context_t *cont, struct threadattr_t *attr, ap_int32_t on)
{
if (on == 1){
attr -> detached = 1;
} else {
attr -> detached = 0;
}
return APR_SUCCESS;
}
ap_status_t ap_getthreadattr_detach(ap_context_t *cont, struct threadattr_t *attr)
{
if (attr->detached == 1){
return APR_SUCCESS;
}
return APR_FAILURE;
}
struct thread_t *ap_create_thread(ap_context_t *cont, struct threadattr_t *attr, ap_thread_start_t func, void *data)
{
struct thread_t *new;
new = (struct thread_t *)ap_palloc(cont->pool, sizeof(struct thread_t));
/* First we create the new thread...*/
if (attr == NULL){
attr = ap_create_threadattr(cont);
}
new->td = spawn_thread((thread_func)func, "apr thread", attr->attr, data);
/* Now we try to run it...*/
if (resume_thread((thread_id)new->td) == B_NO_ERROR) {
return new;
}
else {
return NULL;
}
}
void ap_thread_exit(ap_context_t *cont, ap_status_t *retval)
{
exit_thread ((status_t)retval);
}
ap_status_t ap_thread_join(ap_context_t *cont, ap_thread_t *thd, ap_status_t *retval)
{
if (wait_for_thread(thd->td,(void *)&retval) == B_NO_ERROR) {
return APR_SUCCESS;
}
else {
return APR_FAILURE;
}
}
ap_status_t ap_thread_detach(ap_context_t *cont, ap_thread_t *thd)
{
if (suspend_thread(thd->td) == B_NO_ERROR){
return APR_SUCCESS;
}
else {
return APR_FAILURE;
}
}
1.1 apache-apr/apr/threadproc/beos/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
* 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"
ap_status_t ap_cancel_thread(ap_context_t *cont, struct thread_t *thd)
{
if (kill_thread(thd->td) == 0) {
return APR_SUCCESS;
}
else {
return APR_FAILURE;
}
}
ap_status_t ap_setcanceltype(ap_context_t *cont, ap_int32_t type)
{
/* if (pthread_setcanceltype(type, NULL) == 0) {*/
return APR_SUCCESS;
/* }
else {
return APR_FAILURE;
}*/
}
ap_status_t ap_setcancelstate(ap_context_t *cont, ap_int32_t type)
{
/* if (pthread_setcanceltype(type, NULL) == 0) {*/
return APR_SUCCESS;
/* }
else {
return APR_FAILURE;
}*/
}
1.1 apache-apr/apr/threadproc/beos/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
* 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"
static struct beos_key key_table[BEOS_MAX_DATAKEYS];
static struct beos_private_data *beos_data[BEOS_MAX_DATAKEYS];
static sem_id lock;
struct threadkey_t *ap_create_thread_private(ap_context_t *cont, void (*dest)(void *))
{
struct threadkey_t *key;
key = (struct threadkey_t *)ap_palloc(cont->pool, sizeof(struct threadkey_t));
acquire_sem(lock);
for (key->key=0; key->key < BEOS_MAX_DATAKEYS; key->key++){
if (key_table[key->key].assigned == 0){
key_table[key->key].assigned = 1;
key_table[key->key].destructor = dest;
release_sem(lock);
return key;
}
}
release_sem(lock);
return NULL;
}
void *ap_get_thread_private(ap_context_t *cont, struct threadkey_t *key)
{
void * data;
thread_id tid;
int i, index=0;
tid = find_thread(NULL);
for (i=0;i<BEOS_MAX_DATAKEYS;i++){
if (beos_data[i]->data){
/* it's been used */
if (beos_data[i]->td == tid){
index = i;
}
}
}
if (index == 0){
/* no storage for thread so we can't get anything... */
return NULL;
}
if ((key->key < BEOS_MAX_DATAKEYS) && (key_table)){
acquire_sem(key_table[key->key].lock);
if (key_table[key->key].count){
data = (void*)beos_data[index]->data[key->key];
} else {
data = NULL;
}
release_sem(key_table[key->key].lock);
} else {
data = NULL;
}
return data;
}
ap_status_t ap_set_thread_private(ap_context_t *cont, struct threadkey_t *key, void *priv)
{
thread_id tid;
int i,index = 0, ret;
tid = find_thread(NULL);
for (i=0; i < BEOS_MAX_DATAKEYS; i++){
if (beos_data[i]->data){
if (beos_data[i]->td = tid){index = i;}
}
}
if (index==0){
/* not yet been allocated */
for (i=0; i< BEOS_MAX_DATAKEYS; i++){
if (! beos_data[i]->data){
/* we'll take this one... */
index = i;
beos_data[i]->data = (const void **)malloc(sizeof(void *) * BEOS_MAX_DATAKEYS);
memset((void *)beos_data[i]->data, 0, sizeof(void *) * BEOS_MAX_DATAKEYS);
beos_data[i]->count = (int)malloc(sizeof(int));
beos_data[i]->td = (thread_id)malloc(sizeof(thread_id));
beos_data[i]->td = tid;
}
}
}
if (index == 0){
/* we're out of luck.. */
return APR_FAILURE;
}
if ((key->key < BEOS_MAX_DATAKEYS) && (key_table)){
acquire_sem(key_table[key->key].lock);
if (key_table[key->key].count){
if (beos_data[index]->data[key->key] == NULL){
if (priv != NULL){
beos_data[index]->count++;
key_table[key->key].count++;
}
} else {
if (priv == NULL){
beos_data[index]->count--;
key_table[key->key].count--;
}
}
beos_data[index]->data[key->key] = priv;
ret = 1;
} else {
ret = 0;
}
release_sem(key_table[key->key].lock);
}
if (ret)
return APR_SUCCESS;
return APR_FAILURE;
}
ap_status_t ap_delete_thread_private(ap_context_t *cont, struct threadkey_t *key)
{
if (key->key < BEOS_MAX_DATAKEYS){
acquire_sem(key_table[key->key].lock);
if (key_table[key->key].count == 1){
key_table[key->key].destructor = NULL;
key_table[key->key].count = 0;
}
release_sem(key_table[key->key].lock);
} else {
return APR_FAILURE;
}
return APR_SUCCESS;
}
1.1 apache-apr/apr/threadproc/beos/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
* 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 "fileio.h"
#include "apr_file_io.h"
#include <kernel/OS.h>
#ifndef THREAD_PROC_H
#define THREAD_PROC_H
#define SHELL_PATH "/bin/sh"
#define PTHREAD_CANCEL_AYNCHRONOUS CANCEL_ASYNCH;
#define PTHREAD_CANCEL_DEFERRED CANCEL_DEFER;
#define PTHREAD_CANCEL_ENABLE CANCEL_ENABLE;
#define PTHREAD_CANCEL_DISABLE CANCEL_DISABLE;
#define BEOS_MAX_DATAKEYS 128
struct thread_t {
thread_id td;
};
struct threadattr_t {
int32 attr;
int detached;
int joinable;
};
struct threadkey_t {
int32 key;
};
struct beos_private_data {
const void ** data;
int count;
volatile thread_id td;
};
struct beos_key {
int assigned;
int count;
sem_id lock;
int32 ben_lock;
void (* destructor) ();
};
struct procattr_t {
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 {
pid_t pid;
struct procattr_t *attr;
};
#endif /* ! THREAD_PROC_H */