Helixis 1.0
Task Programming API
sources/liblfds/slist/slist_link.c
Go to the documentation of this file.
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 */
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines