diff options
author | cvs2svn <cvs2svn@FreeBSD.org> | 2000-04-02 07:41:18 +0000 |
---|---|---|
committer | cvs2svn <cvs2svn@FreeBSD.org> | 2000-04-02 07:41:18 +0000 |
commit | b42951578188c5aab5c9f8cbcde4a743f8092cdc (patch) | |
tree | 87e472177973ff9d0a59ecabd43cb630c6936af9 /lib/libpthread/thread/thr_fork.c | |
parent | d45e1e2b8b3d88e925564212283fb9072a911a32 (diff) | |
download | FreeBSD-src-b42951578188c5aab5c9f8cbcde4a743f8092cdc.zip FreeBSD-src-b42951578188c5aab5c9f8cbcde4a743f8092cdc.tar.gz |
This commit was manufactured by cvs2svn to create branch 'ALSA'.
Diffstat (limited to 'lib/libpthread/thread/thr_fork.c')
-rw-r--r-- | lib/libpthread/thread/thr_fork.c | 225 |
1 files changed, 0 insertions, 225 deletions
diff --git a/lib/libpthread/thread/thr_fork.c b/lib/libpthread/thread/thr_fork.c deleted file mode 100644 index a8e85d8..0000000 --- a/lib/libpthread/thread/thr_fork.c +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright (c) 1995-1998 John Birrell <jb@cimlogic.com.au> - * 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 acknowledgement: - * This product includes software developed by John Birrell. - * 4. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS 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 AUTHOR OR 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. - * - * $FreeBSD$ - */ -#include <errno.h> -#include <string.h> -#include <stdlib.h> -#include <unistd.h> -#include <fcntl.h> -#ifdef _THREAD_SAFE -#include <pthread.h> -#include "pthread_private.h" - -pid_t -_fork(void) -{ - int i, flags; - pid_t ret; - pthread_t pthread; - pthread_t pthread_save; - - /* - * Defer signals to protect the scheduling queues from access - * by the signal handler: - */ - _thread_kern_sig_defer(); - - /* Fork a new process: */ - if ((ret = _thread_sys_fork()) != 0) { - /* Parent process or error. Nothing to do here. */ - } else { - /* Close the pthread kernel pipe: */ - _thread_sys_close(_thread_kern_pipe[0]); - _thread_sys_close(_thread_kern_pipe[1]); - - /* Reset signals pending for the running thread: */ - sigemptyset(&_thread_run->sigpend); - - /* - * Create a pipe that is written to by the signal handler to - * prevent signals being missed in calls to - * _thread_sys_select: - */ - if (_thread_sys_pipe(_thread_kern_pipe) != 0) { - /* Cannot create pipe, so abort: */ - PANIC("Cannot create pthread kernel pipe for forked process"); - } - /* Get the flags for the read pipe: */ - else if ((flags = _thread_sys_fcntl(_thread_kern_pipe[0], F_GETFL, NULL)) == -1) { - /* Abort this application: */ - abort(); - } - /* Make the read pipe non-blocking: */ - else if (_thread_sys_fcntl(_thread_kern_pipe[0], F_SETFL, flags | O_NONBLOCK) == -1) { - /* Abort this application: */ - abort(); - } - /* Get the flags for the write pipe: */ - else if ((flags = _thread_sys_fcntl(_thread_kern_pipe[1], F_GETFL, NULL)) == -1) { - /* Abort this application: */ - abort(); - } - /* Make the write pipe non-blocking: */ - else if (_thread_sys_fcntl(_thread_kern_pipe[1], F_SETFL, flags | O_NONBLOCK) == -1) { - /* Abort this application: */ - abort(); - } - /* Reinitialize the GC mutex: */ - else if (_mutex_reinit(&_gc_mutex) != 0) { - /* Abort this application: */ - PANIC("Cannot initialize GC mutex for forked process"); - } - /* Reinitialize the GC condition variable: */ - else if (_cond_reinit(&_gc_cond) != 0) { - /* Abort this application: */ - PANIC("Cannot initialize GC condvar for forked process"); - } - /* Initialize the ready queue: */ - else if (_pq_init(&_readyq) != 0) { - /* Abort this application: */ - PANIC("Cannot initialize priority ready queue."); - } else { - /* - * Enter a loop to remove all threads other than - * the running thread from the thread list: - */ - pthread = TAILQ_FIRST(&_thread_list); - while (pthread != NULL) { - /* Save the thread to be freed: */ - pthread_save = pthread; - - /* - * Advance to the next thread before - * destroying the current thread: - */ - pthread = TAILQ_NEXT(pthread, dle); - - /* Make sure this isn't the running thread: */ - if (pthread_save != _thread_run) { - /* Remove this thread from the list: */ - TAILQ_REMOVE(&_thread_list, - pthread_save, tle); - - if (pthread_save->attr.stackaddr_attr == - NULL && pthread_save->stack != NULL) { - if (pthread_save->attr.stacksize_attr - == PTHREAD_STACK_DEFAULT) { - /* - * Default-size stack. - * Cache it: - */ - struct stack *spare_stack; - - spare_stack - = (pthread_save->stack - + PTHREAD_STACK_DEFAULT - - sizeof(struct stack)); - SLIST_INSERT_HEAD(&_stackq, - spare_stack, qe); - } else - /* - * Free the stack of - * the dead thread: - */ - free(pthread_save->stack); - } - - if (pthread_save->specific_data != NULL) - free(pthread_save->specific_data); - - if (pthread_save->poll_data.fds != NULL) - free(pthread_save->poll_data.fds); - - free(pthread_save); - } - } - - /* Treat the current thread as the initial thread: */ - _thread_initial = _thread_run; - - /* Re-init the dead thread list: */ - TAILQ_INIT(&_dead_list); - - /* Re-init the waiting and work queues. */ - TAILQ_INIT(&_waitingq); - TAILQ_INIT(&_workq); - - /* Re-init the threads mutex queue: */ - TAILQ_INIT(&_thread_run->mutexq); - - /* No spinlocks yet: */ - _spinblock_count = 0; - - /* Don't queue signals yet: */ - _queue_signals = 0; - - /* Initialize signal handling: */ - _thread_sig_init(); - - /* Initialize the scheduling switch hook routine: */ - _sched_switch_hook = NULL; - - /* Clear out any locks in the file descriptor table: */ - for (i = 0; i < _thread_dtablesize; i++) { - if (_thread_fd_table[i] != NULL) { - /* Initialise the file locks: */ - memset(&_thread_fd_table[i]->lock, 0, - sizeof(_thread_fd_table[i]->lock)); - _thread_fd_table[i]->r_owner = NULL; - _thread_fd_table[i]->w_owner = NULL; - _thread_fd_table[i]->r_fname = NULL; - _thread_fd_table[i]->w_fname = NULL; - _thread_fd_table[i]->r_lineno = 0;; - _thread_fd_table[i]->w_lineno = 0;; - _thread_fd_table[i]->r_lockcount = 0;; - _thread_fd_table[i]->w_lockcount = 0;; - - /* Initialise the read/write queues: */ - TAILQ_INIT(&_thread_fd_table[i]->r_queue); - TAILQ_INIT(&_thread_fd_table[i]->w_queue); - } - } - } - } - - /* - * Undefer and handle pending signals, yielding if necessary: - */ - _thread_kern_sig_undefer(); - - /* Return the process ID: */ - return (ret); -} - -__strong_reference(_fork, fork); -#endif |