Changeset 63edcf24 in rtems
- Timestamp:
- 11/02/99 18:40:30 (23 years ago)
- Branches:
- 4.10, 4.11, 4.8, 4.9, 5, master
- Children:
- 43ed935
- Parents:
- cec0371
- Files:
-
- 10 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
c/src/exec/posix/src/Makefile.in
rcec0371 r63edcf24 26 26 condattrinit condattrsetpshared condbroadcast conddefaultattributes \ 27 27 condmp condsignal condsignalsupp condtimedwait condwait condwaitsupp 28 29 KEY_C_PIECES= key keycreate keydelete keygetspecific keyrundestructors \ 30 keysetspecific 28 31 29 32 MESSAGE_QUEUE_C_PIECES= mqueue mqueueclose mqueuecreatesupp mqueuedeletesupp \ … … 68 71 69 72 C_PIECES = adasupp $(CONDITION_VARIABLE_C_PIECES) \ 70 getpid key$(MESSAGE_QUEUE_C_PIECES) \73 getpid $(KEY_C_PIECES) $(MESSAGE_QUEUE_C_PIECES) \ 71 74 $(MUTEX_C_PIECES) $(PTHREAD_C_PIECES) \ 72 75 $(PSIGNAL_C_PIECES) ptimer sched $(SEMAPHORE_C_PIECES) \ -
c/src/exec/posix/src/key.c
rcec0371 r63edcf24 36 36 ); 37 37 } 38 39 /*PAGE40 *41 * 17.1.1 Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 16342 */43 44 int pthread_key_create(45 pthread_key_t *key,46 void (*destructor)( void * )47 )48 {49 POSIX_Keys_Control *the_key;50 void *table;51 unsigned32 the_class;52 unsigned32 bytes_to_allocate;53 54 55 _Thread_Disable_dispatch();56 57 the_key = _POSIX_Keys_Allocate();58 59 if ( !the_key ) {60 _Thread_Enable_dispatch();61 return EAGAIN;62 }63 64 the_key->destructor = destructor;65 66 for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS;67 the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS;68 the_class++ ) {69 70 bytes_to_allocate =71 (_Objects_Information_table[ the_class ]->maximum + 1) * sizeof( void * );72 73 table = _Workspace_Allocate( bytes_to_allocate );74 75 if ( !table ) {76 for ( --the_class;77 the_class >= OBJECTS_CLASSES_FIRST_THREAD_CLASS;78 the_class-- )79 _Workspace_Free( the_key->Values[ the_class ] );80 81 _POSIX_Keys_Free( the_key );82 _Thread_Enable_dispatch();83 return ENOMEM;84 }85 86 the_key->Values[ the_class ] = table;87 memset( table, '\0', bytes_to_allocate );88 }89 90 the_key->is_active = TRUE;91 92 _Objects_Open( &_POSIX_Keys_Information, &the_key->Object, 0 );93 94 *key = the_key->Object.id;95 96 _Thread_Enable_dispatch();97 98 return 0;99 }100 101 /*PAGE102 *103 * 17.1.2 Thread-Specific Data Management, P1003.1c/Draft 10, p. 165104 */105 106 int pthread_setspecific(107 pthread_key_t key,108 const void *value109 )110 {111 register POSIX_Keys_Control *the_key;112 unsigned32 index;113 unsigned32 class;114 Objects_Locations location;115 116 the_key = _POSIX_Keys_Get( key, &location );117 switch ( location ) {118 case OBJECTS_ERROR:119 case OBJECTS_REMOTE: /* should never happen */120 return EINVAL;121 case OBJECTS_LOCAL:122 index = _Objects_Get_index( _Thread_Executing->Object.id );123 class = _Objects_Get_class( _Thread_Executing->Object.id );124 the_key->Values[ class ][ index ] = (void *) value;125 _Thread_Enable_dispatch();126 return 0;127 }128 return POSIX_BOTTOM_REACHED();129 }130 131 /*PAGE132 *133 * 17.1.2 Thread-Specific Data Management, P1003.1c/Draft 10, p. 165134 */135 136 void *pthread_getspecific(137 pthread_key_t key138 )139 {140 register POSIX_Keys_Control *the_key;141 unsigned32 index;142 unsigned32 class;143 Objects_Locations location;144 void *key_data;145 146 the_key = _POSIX_Keys_Get( key, &location );147 switch ( location ) {148 case OBJECTS_ERROR:149 case OBJECTS_REMOTE: /* should never happen */150 return NULL;151 case OBJECTS_LOCAL:152 index = _Objects_Get_index( _Thread_Executing->Object.id );153 class = _Objects_Get_class( _Thread_Executing->Object.id );154 key_data = (void *) the_key->Values[ class ][ index ];155 _Thread_Enable_dispatch();156 return key_data;157 }158 return (void *) POSIX_BOTTOM_REACHED();159 }160 161 /*PAGE162 *163 * 17.1.3 Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167164 */165 166 int pthread_key_delete(167 pthread_key_t key168 )169 {170 register POSIX_Keys_Control *the_key;171 Objects_Locations location;172 unsigned32 the_class;173 174 the_key = _POSIX_Keys_Get( key, &location );175 switch ( location ) {176 case OBJECTS_ERROR:177 case OBJECTS_REMOTE: /* should never happen */178 return EINVAL;179 case OBJECTS_LOCAL:180 _Objects_Close( &_POSIX_Keys_Information, &the_key->Object );181 182 the_key->is_active = FALSE;183 184 for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS;185 the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS;186 the_class++ )187 _Workspace_Free( the_key->Values[ the_class ] );188 189 /*190 * NOTE: The destructor is not called and it is the responsibility191 * of the application to free the memory.192 */193 194 _POSIX_Keys_Free( the_key );195 _Thread_Enable_dispatch();196 return 0;197 }198 return POSIX_BOTTOM_REACHED();199 }200 201 /*PAGE202 *203 * _POSIX_Keys_Run_destructors204 *205 * 17.1.1 Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163206 *207 * NOTE: This is the routine executed when a thread exits to208 * run through all the keys and do the destructor action.209 */210 211 void _POSIX_Keys_Run_destructors(212 Thread_Control *thread213 )214 {215 unsigned32 index;216 unsigned32 pthread_index;217 unsigned32 pthread_class;218 unsigned32 iterations;219 boolean are_all_null;220 POSIX_Keys_Control *the_key;221 void *value;222 223 pthread_index = _Objects_Get_index( thread->Object.id );224 pthread_class = _Objects_Get_class( thread->Object.id );225 226 iterations = 0;227 228 for ( ; ; ) {229 230 are_all_null = TRUE;231 232 for ( index=1 ; index <= _POSIX_Keys_Information.maximum ; index++ ) {233 234 the_key = (POSIX_Keys_Control *)235 _POSIX_Keys_Information.local_table[ index ];236 237 if ( the_key && the_key->is_active && the_key->destructor ) {238 value = the_key->Values[ pthread_class ][ pthread_index ];239 if ( value ) {240 (*the_key->destructor)( value );241 if ( the_key->Values[ pthread_class ][ pthread_index ] )242 are_all_null = FALSE;243 }244 }245 }246 247 if ( are_all_null == TRUE )248 return;249 250 iterations++;251 252 /*253 * The standard allows one to not do this and thus go into an infinite254 * loop. It seems rude to unnecessarily lock up a system.255 *256 * Reference: 17.1.1.2 P1003.1c/Draft 10, p. 163, line 99.257 */258 259 if ( iterations >= PTHREAD_DESTRUCTOR_ITERATIONS )260 return;261 }262 } -
cpukit/posix/src/key.c
rcec0371 r63edcf24 36 36 ); 37 37 } 38 39 /*PAGE40 *41 * 17.1.1 Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 16342 */43 44 int pthread_key_create(45 pthread_key_t *key,46 void (*destructor)( void * )47 )48 {49 POSIX_Keys_Control *the_key;50 void *table;51 unsigned32 the_class;52 unsigned32 bytes_to_allocate;53 54 55 _Thread_Disable_dispatch();56 57 the_key = _POSIX_Keys_Allocate();58 59 if ( !the_key ) {60 _Thread_Enable_dispatch();61 return EAGAIN;62 }63 64 the_key->destructor = destructor;65 66 for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS;67 the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS;68 the_class++ ) {69 70 bytes_to_allocate =71 (_Objects_Information_table[ the_class ]->maximum + 1) * sizeof( void * );72 73 table = _Workspace_Allocate( bytes_to_allocate );74 75 if ( !table ) {76 for ( --the_class;77 the_class >= OBJECTS_CLASSES_FIRST_THREAD_CLASS;78 the_class-- )79 _Workspace_Free( the_key->Values[ the_class ] );80 81 _POSIX_Keys_Free( the_key );82 _Thread_Enable_dispatch();83 return ENOMEM;84 }85 86 the_key->Values[ the_class ] = table;87 memset( table, '\0', bytes_to_allocate );88 }89 90 the_key->is_active = TRUE;91 92 _Objects_Open( &_POSIX_Keys_Information, &the_key->Object, 0 );93 94 *key = the_key->Object.id;95 96 _Thread_Enable_dispatch();97 98 return 0;99 }100 101 /*PAGE102 *103 * 17.1.2 Thread-Specific Data Management, P1003.1c/Draft 10, p. 165104 */105 106 int pthread_setspecific(107 pthread_key_t key,108 const void *value109 )110 {111 register POSIX_Keys_Control *the_key;112 unsigned32 index;113 unsigned32 class;114 Objects_Locations location;115 116 the_key = _POSIX_Keys_Get( key, &location );117 switch ( location ) {118 case OBJECTS_ERROR:119 case OBJECTS_REMOTE: /* should never happen */120 return EINVAL;121 case OBJECTS_LOCAL:122 index = _Objects_Get_index( _Thread_Executing->Object.id );123 class = _Objects_Get_class( _Thread_Executing->Object.id );124 the_key->Values[ class ][ index ] = (void *) value;125 _Thread_Enable_dispatch();126 return 0;127 }128 return POSIX_BOTTOM_REACHED();129 }130 131 /*PAGE132 *133 * 17.1.2 Thread-Specific Data Management, P1003.1c/Draft 10, p. 165134 */135 136 void *pthread_getspecific(137 pthread_key_t key138 )139 {140 register POSIX_Keys_Control *the_key;141 unsigned32 index;142 unsigned32 class;143 Objects_Locations location;144 void *key_data;145 146 the_key = _POSIX_Keys_Get( key, &location );147 switch ( location ) {148 case OBJECTS_ERROR:149 case OBJECTS_REMOTE: /* should never happen */150 return NULL;151 case OBJECTS_LOCAL:152 index = _Objects_Get_index( _Thread_Executing->Object.id );153 class = _Objects_Get_class( _Thread_Executing->Object.id );154 key_data = (void *) the_key->Values[ class ][ index ];155 _Thread_Enable_dispatch();156 return key_data;157 }158 return (void *) POSIX_BOTTOM_REACHED();159 }160 161 /*PAGE162 *163 * 17.1.3 Thread-Specific Data Key Deletion, P1003.1c/Draft 10, p. 167164 */165 166 int pthread_key_delete(167 pthread_key_t key168 )169 {170 register POSIX_Keys_Control *the_key;171 Objects_Locations location;172 unsigned32 the_class;173 174 the_key = _POSIX_Keys_Get( key, &location );175 switch ( location ) {176 case OBJECTS_ERROR:177 case OBJECTS_REMOTE: /* should never happen */178 return EINVAL;179 case OBJECTS_LOCAL:180 _Objects_Close( &_POSIX_Keys_Information, &the_key->Object );181 182 the_key->is_active = FALSE;183 184 for ( the_class = OBJECTS_CLASSES_FIRST_THREAD_CLASS;185 the_class <= OBJECTS_CLASSES_LAST_THREAD_CLASS;186 the_class++ )187 _Workspace_Free( the_key->Values[ the_class ] );188 189 /*190 * NOTE: The destructor is not called and it is the responsibility191 * of the application to free the memory.192 */193 194 _POSIX_Keys_Free( the_key );195 _Thread_Enable_dispatch();196 return 0;197 }198 return POSIX_BOTTOM_REACHED();199 }200 201 /*PAGE202 *203 * _POSIX_Keys_Run_destructors204 *205 * 17.1.1 Thread-Specific Data Key Create, P1003.1c/Draft 10, p. 163206 *207 * NOTE: This is the routine executed when a thread exits to208 * run through all the keys and do the destructor action.209 */210 211 void _POSIX_Keys_Run_destructors(212 Thread_Control *thread213 )214 {215 unsigned32 index;216 unsigned32 pthread_index;217 unsigned32 pthread_class;218 unsigned32 iterations;219 boolean are_all_null;220 POSIX_Keys_Control *the_key;221 void *value;222 223 pthread_index = _Objects_Get_index( thread->Object.id );224 pthread_class = _Objects_Get_class( thread->Object.id );225 226 iterations = 0;227 228 for ( ; ; ) {229 230 are_all_null = TRUE;231 232 for ( index=1 ; index <= _POSIX_Keys_Information.maximum ; index++ ) {233 234 the_key = (POSIX_Keys_Control *)235 _POSIX_Keys_Information.local_table[ index ];236 237 if ( the_key && the_key->is_active && the_key->destructor ) {238 value = the_key->Values[ pthread_class ][ pthread_index ];239 if ( value ) {240 (*the_key->destructor)( value );241 if ( the_key->Values[ pthread_class ][ pthread_index ] )242 are_all_null = FALSE;243 }244 }245 }246 247 if ( are_all_null == TRUE )248 return;249 250 iterations++;251 252 /*253 * The standard allows one to not do this and thus go into an infinite254 * loop. It seems rude to unnecessarily lock up a system.255 *256 * Reference: 17.1.1.2 P1003.1c/Draft 10, p. 163, line 99.257 */258 259 if ( iterations >= PTHREAD_DESTRUCTOR_ITERATIONS )260 return;261 }262 }
Note: See TracChangeset
for help on using the changeset viewer.