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 /cpukit/posix/src/keydelete.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 '')
-rw-r--r-- | cpukit/posix/src/keydelete.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/cpukit/posix/src/keydelete.c b/cpukit/posix/src/keydelete.c new file mode 100644 index 0000000000..af012e3638 --- /dev/null +++ b/cpukit/posix/src/keydelete.c @@ -0,0 +1,53 @@ +/* + * $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 + * + * 17.1.3 Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167 + */ + +int pthread_key_delete( + pthread_key_t key +) +{ + register POSIX_Keys_Control *the_key; + Objects_Locations location; + unsigned32 the_class; + + the_key = _POSIX_Keys_Get( key, &location ); + switch ( location ) { + case OBJECTS_ERROR: + case OBJECTS_REMOTE: /* should never happen */ + return EINVAL; + case OBJECTS_LOCAL: + _Objects_Close( &_POSIX_Keys_Information, &the_key->Object ); + + the_key->is_active = FALSE; + + for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS; + the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS; + the_class++ ) + _Workspace_Free( the_key->Values[ the_class ] ); + + /* + * NOTE: The destructor is not called and it is the responsibility + * of the application to free the memory. + */ + + _POSIX_Keys_Free( the_key ); + _Thread_Enable_dispatch(); + return 0; + } + return POSIX_BOTTOM_REACHED(); +} |