1
/* ==== pthread_detach.c =======================================================
2
* Copyright (c) 1994 by Chris Provenzano, proven@mit.edu
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
* 3. All advertising materials mentioning features or use of this software
14
* must display the following acknowledgement:
15
* This product includes software developed by Chris Provenzano.
16
* 4. The name of Chris Provenzano may not be used to endorse or promote
17
* products derived from this software without specific prior written
20
* THIS SOFTWARE IS PROVIDED BY CHRIS PROVENZANO ``AS IS'' AND
21
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
* ARE DISCLAIMED. IN NO EVENT SHALL CHRIS PROVENZANO BE LIABLE FOR ANY
24
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
* Description : pthread_join function.
34
* 1.00 94/01/15 proven
35
* -Started coding this file.
39
static const char rcsid[] = "$Id$";
45
/* ==========================================================================
48
int pthread_detach(pthread_t pthread)
50
struct pthread * next_thread, * high_thread, * low_thread;
53
pthread_sched_prevent();
55
/* Check that thread isn't detached already */
56
if (!(pthread->attr.flags & PTHREAD_DETACHED)) {
58
pthread->attr.flags |= PTHREAD_DETACHED;
60
/* Wakeup all threads waiting on a join */
61
if (next_thread = pthread_queue_deq(&(pthread->join_queue))) {
62
high_thread = next_thread;
64
while (next_thread = pthread_queue_deq(&(pthread->join_queue))) {
65
if (high_thread->pthread_priority < next_thread->pthread_priority) {
66
low_thread = high_thread;
67
high_thread = next_thread;
69
low_thread = next_thread;
71
pthread_prio_queue_enq(pthread_current_prio_queue, low_thread);
72
low_thread->state = PS_RUNNING;
74
/* If the thread is dead then move it to the alloc queue */
75
if (pthread_queue_remove(&pthread_dead_queue, pthread) == OK) {
76
pthread_queue_enq(&pthread_alloc_queue, pthread);
78
pthread_sched_other_resume(high_thread);
81
/* If the thread is dead then move it to the alloc queue */
82
if (pthread_queue_remove(&pthread_dead_queue, pthread) == OK) {
83
pthread_queue_enq(&pthread_alloc_queue, pthread);
84
pthread->state = PS_UNALLOCED;
90
pthread_sched_resume();