From da82656065d09f7b6aa411ba361287afdd787204 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 13 May 2016 10:28:14 +0200 Subject: posix: Rework thread cancellation Add Thread_Life_state::THREAD_LIFE_CHANGE_DEFERRED and rework the POSIX thread cancellation to use the thread life states. Update #2555. Update #2626. --- cpukit/posix/src/setcanceltype.c | 54 +++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 29 deletions(-) (limited to 'cpukit/posix/src/setcanceltype.c') diff --git a/cpukit/posix/src/setcanceltype.c b/cpukit/posix/src/setcanceltype.c index 8c4687a981..701317f1d6 100644 --- a/cpukit/posix/src/setcanceltype.c +++ b/cpukit/posix/src/setcanceltype.c @@ -9,6 +9,8 @@ * COPYRIGHT (c) 1989-2009. * On-Line Applications Research Corporation (OAR). * + * Copyright (c) 2016 embedded brains GmbH. + * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.org/license/LICENSE. @@ -21,13 +23,8 @@ #include #include -#include -#include #include -#include -#include -#include -#include +#include /* * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183 @@ -38,35 +35,34 @@ int pthread_setcanceltype( int *oldtype ) { - POSIX_API_Control *thread_support; - Thread_Control *executing; - - /* - * Don't even think about deleting a resource from an ISR. - * Besides this request is supposed to be for _Thread_Executing - * and the ISR context is not a thread. - */ + Thread_Life_state set_life_state; + Thread_Life_state previous_life_state; - if ( _ISR_Is_in_progress() ) + if ( _ISR_Is_in_progress() ) { return EPROTO; + } - if ( type != PTHREAD_CANCEL_DEFERRED && type != PTHREAD_CANCEL_ASYNCHRONOUS ) + if ( type == PTHREAD_CANCEL_DEFERRED ) { + set_life_state = THREAD_LIFE_CHANGE_DEFERRED; + } else if ( type == PTHREAD_CANCEL_ASYNCHRONOUS ) { + set_life_state = 0; + } else { return EINVAL; + } - _Thread_Disable_dispatch(); - - executing = _Thread_Executing; - thread_support = executing ->API_Extensions[ THREAD_API_POSIX ]; - - if ( oldtype != NULL ) - *oldtype = thread_support->cancelability_type; - - thread_support->cancelability_type = type; + previous_life_state = _Thread_Change_life( + THREAD_LIFE_CHANGE_DEFERRED, + set_life_state, + 0 + ); - _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch( executing ); + if ( oldtype != NULL ) { + if ( ( previous_life_state & THREAD_LIFE_CHANGE_DEFERRED ) != 0 ) { + *oldtype = PTHREAD_CANCEL_DEFERRED; + } else { + *oldtype = PTHREAD_CANCEL_ASYNCHRONOUS; + } + } - /* - * _Thread_Enable_dispatch is invoked by above call. - */ return 0; } -- cgit v1.2.3