![]() |
Helixis 1.0
Task Programming API
|
00001 /***** the library wide include file *****/ 00002 #include "liblfds/liblfds_internal.h" 00003 00004 #if defined(HLX_BUILD_WITH_PARALLEL_THREADING) 00005 00006 /***** defines *****/ 00007 #define SLIST_USER_DATA 0 00008 #define SLIST_FLAGS 1 00009 00010 #define SLIST_NO_FLAGS 0x0 00011 #define SLIST_FLAG_DELETED 0x1 00012 00013 /***** structures *****/ 00014 #pragma pack( push, ALIGN_SINGLE_POINTER ) 00015 00016 struct slist_state 00017 { 00018 struct slist_element 00019 *volatile head; 00020 00021 void 00022 (*user_data_delete_function)( void *user_data, void *user_state ), 00023 *user_state; 00024 }; 00025 00026 #pragma pack( pop ) 00027 00028 #pragma pack( push, ALIGN_DOUBLE_POINTER ) 00029 00030 /* TRD : this pragma pack doesn't seem to work under Windows 00031 if the structure members are the correct way round 00032 (next first), then user_data_and_flags ends up on 00033 a single pointer boundary and DCAS crashes 00034 00035 accordingly, I've moved user_data_and_flags first 00036 */ 00037 00038 struct slist_element 00039 { 00040 void 00041 *volatile user_data_and_flags[2]; 00042 00043 /* TRD : requires volatile as is target of CAS */ 00044 struct slist_element 00045 *volatile next; 00046 }; 00047 00048 #pragma pack( pop ) 00049 00050 /***** private prototypes *****/ 00051 void slist_internal_init_slist( struct slist_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ); 00052 00053 void slist_internal_link_element_to_head( struct slist_state *slist_state, struct slist_element *volatile se ); 00054 void slist_internal_link_element_after_element( struct slist_element *volatile slist_in_list_element, struct slist_element *volatile se ); 00055 00056 void slist_internal_move_to_first_undeleted_element( struct slist_element **se ); 00057 00058 #endif