1/* 2 * Copyright (c) 2010 Apple Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of Apple Inc. ("Apple") nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 * Portions of this software have been released under the following terms: 31 * 32 * (c) Copyright 1989-1993 OPEN SOFTWARE FOUNDATION, INC. 33 * (c) Copyright 1989-1993 HEWLETT-PACKARD COMPANY 34 * (c) Copyright 1989-1993 DIGITAL EQUIPMENT CORPORATION 35 * 36 * To anyone who acknowledges that this file is provided "AS IS" 37 * without any express or implied warranty: 38 * permission to use, copy, modify, and distribute this file for any 39 * purpose is hereby granted without fee, provided that the above 40 * copyright notices and this notice appears in all source code copies, 41 * and that none of the names of Open Software Foundation, Inc., Hewlett- 42 * Packard Company or Digital Equipment Corporation be used 43 * in advertising or publicity pertaining to distribution of the software 44 * without specific, written prior permission. Neither Open Software 45 * Foundation, Inc., Hewlett-Packard Company nor Digital 46 * Equipment Corporation makes any representations about the suitability 47 * of this software for any purpose. 48 * 49 * Copyright (c) 2007, Novell, Inc. All rights reserved. 50 * Redistribution and use in source and binary forms, with or without 51 * modification, are permitted provided that the following conditions 52 * are met: 53 * 54 * 1. Redistributions of source code must retain the above copyright 55 * notice, this list of conditions and the following disclaimer. 56 * 2. Redistributions in binary form must reproduce the above copyright 57 * notice, this list of conditions and the following disclaimer in the 58 * documentation and/or other materials provided with the distribution. 59 * 3. Neither the name of Novell Inc. nor the names of its contributors 60 * may be used to endorse or promote products derived from this 61 * this software without specific prior written permission. 62 * 63 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 64 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 65 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 66 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY 67 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 68 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 69 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 70 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 71 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 72 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 73 * 74 * @APPLE_LICENSE_HEADER_END@ 75 */ 76 77#ifndef __DCETHREAD_PRIVATE_H__ 78#define __DCETHREAD_PRIVATE_H__ 79 80#include <dce/dcethread.h> 81 82struct _dcethread 83{ 84 /* Handle of associated pthread */ 85 pthread_t pthread; 86 87 /* Reference count */ 88 unsigned int refs; 89 90 /* Current state of thread 91 Changing state should be done with 92 lock held and a signal should be 93 broadcast on state_changed */ 94 enum 95 { 96 /* Normal, running state */ 97 DCETHREAD_STATE_ACTIVE = 0, 98 /* Blocked */ 99 DCETHREAD_STATE_BLOCKED = 1, 100 /* An interrupt has been requested */ 101 DCETHREAD_STATE_INTERRUPT = 2, 102 /* Thread has exited */ 103 DCETHREAD_STATE_DEAD = 5, 104 /* Thread has been created but is not yet running */ 105 DCETHREAD_STATE_CREATED = 6 106 } state; 107 108 /* Boolean attributes */ 109 struct 110 { 111 /* Do we own the underlying pthread? 112 (that is, it should be joined/detached when 113 this dcethread is deleted) 114 FIXME: give this a better name */ 115 unsigned joinable :1; 116 /* Is asychronous cancellation enabled? */ 117 unsigned async :1; 118 /* Is the thread currently interruptible? */ 119 unsigned interruptible :1; 120 /* Is the thread currently locked? (for debugging) */ 121 unsigned locked :1; 122 } flag; 123 124 /* Return status (as set by pthread_exit() or returning from start func) */ 125 void* status; 126 127 /* Function to perform an interruption on this thread. 128 This function is called after setting the state to 129 INTERRUPT in order to wake it up as necessary. 130 Returns 1 if the thread is definitely interrupted, 131 0 if it may not have worked */ 132 int (*interrupt)(dcethread* thread, void* data); 133 134 /* Data pointer for interruption function */ 135 void *interrupt_data; 136 137 /* Function to handle an interruption. 138 This function is invoked within this thread when 139 an interruption is acknowledged. The default 140 behavior is to throw an exception. */ 141 void (*handle_interrupt)(dcethread* thread, void* data); 142 143 /* Data pointer for interrupt handler function */ 144 void *handle_interrupt_data; 145 146 /* Lock for atomically updating this structure */ 147 pthread_mutex_t lock; 148 149 /* Condition variable to wait for a state change */ 150 pthread_cond_t state_change; 151}; 152 153typedef struct 154{ 155 dcethread_mutex *mutex; 156 dcethread_cond *cond; 157} condwait_info; 158 159void dcethread__init (void); 160dcethread* dcethread__new (void); 161void dcethread__delete(dcethread* thread); 162dcethread* dcethread__self(void); 163void dcethread__init_self(dcethread* thread); 164void dcethread__retain(dcethread* thread); 165void dcethread__release(dcethread* thread); 166void dcethread__lock(dcethread* thread); 167void dcethread__unlock(dcethread* info); 168void dcethread__wait(dcethread* thread); 169void dcethread__timedwait(dcethread* thread, struct timespec* ts); 170void dcethread__change_state(dcethread* thread, int state); 171void dcethread__lock_global(void); 172void dcethread__unlock_global(void); 173void dcethread__dispatchinterrupt(dcethread* thread); 174void dcethread__interrupt(dcethread* thread); 175void dcethread__set_interrupt_handler(dcethread* thread, void (*handle_interrupt)(dcethread*, void*), void* data); 176int dcethread__begin_block(dcethread* thread, int (*interrupt)(dcethread*, void*), void* data, int (**old_interrupt)(dcethread*, void*), void** old_data); 177int dcethread__poll_end_block(dcethread* thread, int (*interrupt)(dcethread*, void*), void* data); 178int dcethread__end_block(dcethread* thread, int (*interrupt)(dcethread*, void*), void* data); 179int dcethread__interrupt_syscall(dcethread* thread, void* data); 180int dcethread__interrupt_condwait(dcethread* thread, void* data); 181void dcethread__cleanup_self(dcethread* self); 182 183#endif 184