/* * $Id$ */ #include #include #include #include #include #include #include #include #include #include /*PAGE * * 18.2.3.1 Establishing Cancellation Handlers, P1003.1c/Draft 10, p. 184 */ void pthread_cleanup_push( void (*routine)( void * ), void *arg ) { POSIX_Cancel_Handler_control *handler; Chain_Control *handler_stack; POSIX_API_Control *thread_support; if ( !routine ) return; /* XXX what to do really? */ handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) ); if ( !handler ) return; /* XXX what to do really? */ thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; handler_stack = &thread_support->Cancellation_Handlers; handler->routine = routine; handler->arg = arg; _Chain_Append( handler_stack, &handler->Node ); }