summaryrefslogtreecommitdiffstats
path: root/c/src/exec/posix/src/keyrundestructors.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1999-11-02 18:40:30 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1999-11-02 18:40:30 +0000
commit63edcf242a2cd5d53537bae95943b5fcd0eed5fe (patch)
treeef89e3990ce24e032e35edd2807d77e0c3561a1a /c/src/exec/posix/src/keyrundestructors.c
parentWrong routine was initially cut into this file. (diff)
downloadrtems-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.c76
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;
+ }
+}