Home | History | Annotate | Download | only in pthreads-win32
      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