diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-11-02 18:40:30 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-11-02 18:40:30 +0000 |
commit | 63edcf242a2cd5d53537bae95943b5fcd0eed5fe (patch) | |
tree | ef89e3990ce24e032e35edd2807d77e0c3561a1a /c/src/exec/posix/src/keyrundestructors.c | |
parent | Wrong routine was initially cut into this file. (diff) | |
download | rtems-63edcf242a2cd5d53537bae95943b5fcd0eed5fe.tar.bz2 |
Split key.c into multiple files.
Diffstat (limited to 'c/src/exec/posix/src/keyrundestructors.c')
-rw-r--r-- | c/src/exec/posix/src/keyrundestructors.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/c/src/exec/posix/src/keyrundestructors.c b/c/src/exec/posix/src/keyrundestructors.c new file mode 100644 index 0000000000..b3047f5fe8 --- /dev/null +++ b/c/src/exec/posix/src/keyrundestructors.c @@ -0,0 +1,76 @@ +/* + * $Id$ + */ + +#include <errno.h> +#include <limits.h> +#include <pthread.h> +#include <string.h> + +#include <rtems/system.h> +#include <rtems/score/thread.h> +#include <rtems/score/wkspace.h> +#include <rtems/posix/key.h> + +/*PAGE + * + * _POSIX_Keys_Run_destructors + * + * 17.1.1 Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163 + * + * NOTE: This is the routine executed when a thread exits to + * run through all the keys and do the destructor action. + */ + +void _POSIX_Keys_Run_destructors( + Thread_Control *thread +) +{ + unsigned32 index; + unsigned32 pthread_index; + unsigned32 pthread_class; + unsigned32 iterations; + boolean are_all_null; + POSIX_Keys_Control *the_key; + void *value; + + pthread_index = _Objects_Get_index( thread->Object.id ); + pthread_class = _Objects_Get_class( thread->Object.id ); + + iterations = 0; + + for ( ; ; ) { + + are_all_null = TRUE; + + for ( index=1 ; index <= _POSIX_Keys_Information.maximum ; index++ ) { + + the_key = (POSIX_Keys_Control *) + _POSIX_Keys_Information.local_table[ index ]; + + if ( the_key && the_key->is_active && the_key->destructor ) { + value = the_key->Values[ pthread_class ][ pthread_index ]; + if ( value ) { + (*the_key->destructor)( value ); + if ( the_key->Values[ pthread_class ][ pthread_index ] ) + are_all_null = FALSE; + } + } + } + + if ( are_all_null == TRUE ) + return; + + iterations++; + + /* + * The standard allows one to not do this and thus go into an infinite + * loop. It seems rude to unnecessarily lock up a system. + * + * Reference: 17.1.1.2 P1003.1c/Draft 10, p. 163, line 99. + */ + + if ( iterations >= PTHREAD_DESTRUCTOR_ITERATIONS ) + return; + } +} |