![]() |
Helixis 1.0
Task Programming API
|
00001 #include "slist_internal.h" 00002 #if defined(HLX_BUILD_WITH_PARALLEL_THREADING) 00003 extern hlx_api gl_api; 00004 00005 void slist_internal_link_element_to_head( struct slist_state *ss, struct slist_element *volatile se ) 00006 { 00007 ALIGN(ALIGN_SINGLE_POINTER) struct slist_element 00008 *se_next; 00009 00010 se_next = ss->head; 00011 00012 do 00013 { 00014 se->next = se_next; 00015 } 00016 while( se->next != (se_next = (struct slist_element *) gl_api.atomic_cas_entry((volatile atom_t *) &ss->head, (atom_t) se, (atom_t) se->next)) ); 00017 00018 return; 00019 } 00020 00021 void slist_internal_link_element_after_element( struct slist_element *volatile slist_in_list_element, struct slist_element *volatile se ) 00022 { 00023 ALIGN(ALIGN_SINGLE_POINTER) struct slist_element 00024 *se_prev, 00025 *se_next; 00026 00027 se_prev = (struct slist_element *) slist_in_list_element; 00028 00029 se_next = se_prev->next; 00030 00031 do 00032 { 00033 se->next = se_next; 00034 } 00035 while( se->next != (se_next = (struct slist_element *) gl_api.atomic_cas_entry((volatile atom_t *) &se_prev->next, (atom_t) se, (atom_t) se->next)) ); 00036 00037 return; 00038 } 00039 00040 #endif /* !HLX_BUILD_WITH_PARALLEL_THREADING */