diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-13 10:28:14 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-20 07:49:39 +0200 |
commit | da82656065d09f7b6aa411ba361287afdd787204 (patch) | |
tree | 3a17cae7059c89d111642cb27a1cf55ded61f604 /cpukit/posix/src/setcancelstate.c | |
parent | score: Avoid Giant lock for _Thread_Start() (diff) | |
download | rtems-da82656065d09f7b6aa411ba361287afdd787204.tar.bz2 |
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.
Diffstat (limited to 'cpukit/posix/src/setcancelstate.c')
-rw-r--r-- | cpukit/posix/src/setcancelstate.c | 51 |
1 files changed, 21 insertions, 30 deletions
diff --git a/cpukit/posix/src/setcancelstate.c b/cpukit/posix/src/setcancelstate.c index a451c2c4b4..b0a42e86b8 100644 --- a/cpukit/posix/src/setcancelstate.c +++ b/cpukit/posix/src/setcancelstate.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 <pthread.h> #include <errno.h> -#include <rtems/system.h> -#include <rtems/score/chain.h> #include <rtems/score/isr.h> -#include <rtems/score/thread.h> -#include <rtems/posix/cancel.h> -#include <rtems/posix/pthreadimpl.h> -#include <rtems/posix/threadsup.h> +#include <rtems/score/threadimpl.h> /* * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183 @@ -38,36 +35,30 @@ int pthread_setcancelstate( int *oldstate ) { - 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 new_life_protection; + Thread_Life_state previous_life_state; - if ( _ISR_Is_in_progress() ) + if ( _ISR_Is_in_progress() ) { return EPROTO; + } - if ( state != PTHREAD_CANCEL_ENABLE && state != PTHREAD_CANCEL_DISABLE ) + if ( state == PTHREAD_CANCEL_DISABLE ) { + new_life_protection = THREAD_LIFE_PROTECTED; + } else if ( state == PTHREAD_CANCEL_ENABLE ) { + new_life_protection = 0; + } else { return EINVAL; + } - _Thread_Disable_dispatch(); - - executing = _Thread_Executing; - thread_support = executing ->API_Extensions[ THREAD_API_POSIX ]; - - if (oldstate != NULL) - *oldstate = thread_support->cancelability_state; - - thread_support->cancelability_state = state; - - _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch( executing ); + previous_life_state = _Thread_Set_life_protection( new_life_protection ); - /* - * _Thread_Enable_dispatch is invoked by above call. - */ + if ( oldstate != NULL ) { + if ( ( previous_life_state & THREAD_LIFE_PROTECTED ) != 0 ) { + *oldstate = PTHREAD_CANCEL_DISABLE; + } else { + *oldstate = PTHREAD_CANCEL_ENABLE; + } + } return 0; } |