1 /* 2 * cleanup.c 3 * 4 * Description: 5 * This translation unit implements routines associated 6 * with cleaning up threads. 7 * 8 * 9 * -------------------------------------------------------------------------- 10 * 11 * Pthreads-win32 - POSIX Threads Library for Win32 12 * Copyright(C) 1998 John E. Bossom 13 * Copyright(C) 1999,2005 Pthreads-win32 contributors 14 * 15 * Contact Email: rpj (at) callisto.canberra.edu.au 16 * 17 * The current list of contributors is contained 18 * in the file CONTRIBUTORS included with the source 19 * code distribution. The list can also be seen at the 20 * following World Wide Web location: 21 * http://sources.redhat.com/pthreads-win32/contributors.html 22 * 23 * This library is free software; you can redistribute it and/or 24 * modify it under the terms of the GNU Lesser General Public 25 * License as published by the Free Software Foundation; either 26 * version 2 of the License, or (at your option) any later version. 27 * 28 * This library is distributed in the hope that it will be useful, 29 * but WITHOUT ANY WARRANTY; without even the implied warranty of 30 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 31 * Lesser General Public License for more details. 32 * 33 * You should have received a copy of the GNU Lesser General Public 34 * License along with this library in the file COPYING.LIB; 35 * if not, write to the Free Software Foundation, Inc., 36 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 37 */ 38 39 #include "pthread.h" 40 #include "implement.h" 41 42 43 /* 44 * The functions ptw32_pop_cleanup and ptw32_push_cleanup 45 * are implemented here for applications written in C with no 46 * SEH or C++ destructor support. 47 */ 48 49 ptw32_cleanup_t * 50 ptw32_pop_cleanup (int execute) 51 /* 52 * ------------------------------------------------------ 53 * DOCPUBLIC 54 * This function pops the most recently pushed cleanup 55 * handler. If execute is nonzero, then the cleanup handler 56 * is executed if non-null. 57 * 58 * PARAMETERS 59 * execute 60 * if nonzero, execute the cleanup handler 61 * 62 * 63 * DESCRIPTION 64 * This function pops the most recently pushed cleanup 65 * handler. If execute is nonzero, then the cleanup handler 66 * is executed if non-null. 67 * NOTE: specify 'execute' as nonzero to avoid duplication 68 * of common cleanup code. 69 * 70 * RESULTS 71 * N/A 72 * 73 * ------------------------------------------------------ 74 */ 75 { 76 ptw32_cleanup_t *cleanup; 77 78 cleanup = (ptw32_cleanup_t *) pthread_getspecific (ptw32_cleanupKey); 79 80 if (cleanup != NULL) 81 { 82 if (execute && (cleanup->routine != NULL)) 83 { 84 85 (*cleanup->routine) (cleanup->arg); 86 87 } 88 89 pthread_setspecific (ptw32_cleanupKey, (void *) cleanup->prev); 90 91 } 92 93 return (cleanup); 94 95 } /* ptw32_pop_cleanup */ 96 97 98 void 99 ptw32_push_cleanup (ptw32_cleanup_t * cleanup, 100 ptw32_cleanup_callback_t routine, void *arg) 101 /* 102 * ------------------------------------------------------ 103 * DOCPUBLIC 104 * This function pushes a new cleanup handler onto the thread's stack 105 * of cleanup handlers. Each cleanup handler pushed onto the stack is 106 * popped and invoked with the argument 'arg' when 107 * a) the thread exits by calling 'pthread_exit', 108 * b) when the thread acts on a cancellation request, 109 * c) or when the thread calls pthread_cleanup_pop with a nonzero 110 * 'execute' argument 111 * 112 * PARAMETERS 113 * cleanup 114 * a pointer to an instance of pthread_cleanup_t, 115 * 116 * routine 117 * pointer to a cleanup handler, 118 * 119 * arg 120 * parameter to be passed to the cleanup handler 121 * 122 * 123 * DESCRIPTION 124 * This function pushes a new cleanup handler onto the thread's stack 125 * of cleanup handlers. Each cleanup handler pushed onto the stack is 126 * popped and invoked with the argument 'arg' when 127 * a) the thread exits by calling 'pthread_exit', 128 * b) when the thread acts on a cancellation request, 129 * c) or when the thrad calls pthread_cleanup_pop with a nonzero 130 * 'execute' argument 131 * NOTE: pthread_push_cleanup, ptw32_pop_cleanup must be paired 132 * in the same lexical scope. 133 * 134 * RESULTS 135 * pthread_cleanup_t * 136 * pointer to the previous cleanup 137 * 138 * ------------------------------------------------------ 139 */ 140 { 141 cleanup->routine = routine; 142 cleanup->arg = arg; 143 144 cleanup->prev = (ptw32_cleanup_t *) pthread_getspecific (ptw32_cleanupKey); 145 146 pthread_setspecific (ptw32_cleanupKey, (void *) cleanup); 147 148 } /* ptw32_push_cleanup */ 149