![]() |
Helixis 1.0
Task Programming API
|
00001 #include "slist_internal.h" 00002 #if defined(HLX_BUILD_WITH_PARALLEL_THREADING) 00003 00004 int slist_get_user_data_from_element( struct slist_element *se, void **user_data ) 00005 { 00006 int 00007 rv = 1; 00008 00009 *user_data = (void *) se->user_data_and_flags[SLIST_USER_DATA]; 00010 00011 if( (atom_t) se->user_data_and_flags[SLIST_FLAGS] & SLIST_FLAG_DELETED ) 00012 rv = 0; 00013 00014 return( rv ); 00015 } 00016 00017 struct slist_element *slist_get_head( struct slist_state *ss, struct slist_element **se ) 00018 { 00019 *se = (struct slist_element *) ss->head; 00020 00021 slist_internal_move_to_first_undeleted_element( se ); 00022 00023 return( *se ); 00024 } 00025 00026 struct slist_element *slist_get_next( struct slist_element *se, struct slist_element **next_se ) 00027 { 00028 *next_se = (struct slist_element *) se->next; 00029 00030 slist_internal_move_to_first_undeleted_element( next_se ); 00031 00032 return( *next_se ); 00033 } 00034 00035 struct slist_element *slist_get_head_and_then_next( struct slist_state *ss, struct slist_element **se ) 00036 { 00037 if( *se == 0 ) 00038 slist_get_head( ss, se ); 00039 else 00040 slist_get_next( *se, se ); 00041 00042 return( *se ); 00043 } 00044 00045 void slist_internal_move_to_first_undeleted_element( struct slist_element **se ) 00046 { 00047 while( *se != 0 and (atom_t) (*se)->user_data_and_flags[SLIST_FLAGS] & SLIST_FLAG_DELETED ) 00048 (*se) = (struct slist_element *) (*se)->next; 00049 00050 return; 00051 } 00052 00053 #endif /* !HLX_BUILD_WITH_PARALLEL_THREADING */