15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cleanup.c
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description:
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This translation unit implements routines associated
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * with cleaning up threads.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * --------------------------------------------------------------------------
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Pthreads-win32 - POSIX Threads Library for Win32
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Copyright(C) 1998 John E. Bossom
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Copyright(C) 1999,2005 Pthreads-win32 contributors
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Contact Email: rpj@callisto.canberra.edu.au
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      The current list of contributors is contained
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      in the file CONTRIBUTORS included with the source
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      code distribution. The list can also be seen at the
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      following World Wide Web location:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      http://sources.redhat.com/pthreads-win32/contributors.html
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      This library is free software; you can redistribute it and/or
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      modify it under the terms of the GNU Lesser General Public
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      License as published by the Free Software Foundation; either
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      version 2 of the License, or (at your option) any later version.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      This library is distributed in the hope that it will be useful,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      but WITHOUT ANY WARRANTY; without even the implied warranty of
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      Lesser General Public License for more details.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      You should have received a copy of the GNU Lesser General Public
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      License along with this library in the file COPYING.LIB;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      if not, write to the Free Software Foundation, Inc.,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "pthread.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "implement.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The functions ptw32_pop_cleanup and ptw32_push_cleanup
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * are implemented here for applications written in C with no
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * SEH or C++ destructor support.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ptw32_cleanup_t *
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ptw32_pop_cleanup (int execute)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /*
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * ------------------------------------------------------
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * DOCPUBLIC
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      This function pops the most recently pushed cleanup
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      handler. If execute is nonzero, then the cleanup handler
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      is executed if non-null.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * PARAMETERS
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      execute
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *              if nonzero, execute the cleanup handler
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * DESCRIPTION
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      This function pops the most recently pushed cleanup
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      handler. If execute is nonzero, then the cleanup handler
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      is executed if non-null.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      NOTE: specify 'execute' as nonzero to avoid duplication
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *                of common cleanup code.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * RESULTS
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *              N/A
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * ------------------------------------------------------
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ptw32_cleanup_t *cleanup;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cleanup = (ptw32_cleanup_t *) pthread_getspecific (ptw32_cleanupKey);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cleanup != NULL)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (execute && (cleanup->routine != NULL))
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  (*cleanup->routine) (cleanup->arg);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pthread_setspecific (ptw32_cleanupKey, (void *) cleanup->prev);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (cleanup);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}				/* ptw32_pop_cleanup */
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ptw32_push_cleanup (ptw32_cleanup_t * cleanup,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		    ptw32_cleanup_callback_t routine, void *arg)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     /*
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * ------------------------------------------------------
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * DOCPUBLIC
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      This function pushes a new cleanup handler onto the thread's stack
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      of cleanup handlers. Each cleanup handler pushed onto the stack is
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      popped and invoked with the argument 'arg' when
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *              a) the thread exits by calling 'pthread_exit',
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *              b) when the thread acts on a cancellation request,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *              c) or when the thread calls pthread_cleanup_pop with a nonzero
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *                 'execute' argument
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * PARAMETERS
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      cleanup
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *              a pointer to an instance of pthread_cleanup_t,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      routine
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *              pointer to a cleanup handler,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      arg
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *              parameter to be passed to the cleanup handler
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * DESCRIPTION
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      This function pushes a new cleanup handler onto the thread's stack
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      of cleanup handlers. Each cleanup handler pushed onto the stack is
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      popped and invoked with the argument 'arg' when
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *              a) the thread exits by calling 'pthread_exit',
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *              b) when the thread acts on a cancellation request,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *              c) or when the thrad calls pthread_cleanup_pop with a nonzero
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *                 'execute' argument
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *      NOTE: pthread_push_cleanup, ptw32_pop_cleanup must be paired
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *                in the same lexical scope.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * RESULTS
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *              pthread_cleanup_t *
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *                              pointer to the previous cleanup
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      * ------------------------------------------------------
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      */
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cleanup->routine = routine;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cleanup->arg = arg;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cleanup->prev = (ptw32_cleanup_t *) pthread_getspecific (ptw32_cleanupKey);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pthread_setspecific (ptw32_cleanupKey, (void *) cleanup);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}				/* ptw32_push_cleanup */
149