![]() |
Helixis 1.0
Task Programming API
|
00001 #include "slist_internal.h" 00002 #if defined(HLX_BUILD_WITH_PARALLEL_THREADING) 00003 00004 extern hlx_api gl_api; 00005 00006 int slist_new( struct slist_state **ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ) 00007 { 00008 int 00009 rv = 0; 00010 00011 /* TRD : user_data_delete_function can be 0 */ 00012 /* TRD : user_state can be 0 */ 00013 00014 *ss = (struct slist_state *) gl_api.aligned_malloc_entry( sizeof(struct slist_state), ALIGN_SINGLE_POINTER ); 00015 00016 if( *ss != 0 ) 00017 { 00018 slist_internal_init_slist( *ss, user_data_delete_function, user_state ); 00019 rv = 1; 00020 } 00021 00022 return( rv ); 00023 } 00024 00025 void slist_internal_init_slist( struct slist_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ) 00026 { 00027 /* TRD : user_data_delete_function can be 0 */ 00028 /* TRD : user_state can be 0 */ 00029 00030 ss->head = 0; 00031 ss->user_data_delete_function = user_data_delete_function; 00032 ss->user_state = user_state; 00033 00034 return; 00035 } 00036 00037 struct slist_element *slist_new_head( struct slist_state *ss, void *user_data ) 00038 { 00039 ALIGN(ALIGN_SINGLE_POINTER) struct slist_element 00040 *volatile se; 00041 00042 /* TRD : user_data can be 0 */ 00043 00044 se = (struct slist_element *) gl_api.aligned_malloc_entry( sizeof(struct slist_element), ALIGN_DOUBLE_POINTER ); 00045 00046 if( se != 0 ) 00047 { 00048 se->user_data_and_flags[SLIST_USER_DATA] = user_data; 00049 se->user_data_and_flags[SLIST_FLAGS] = SLIST_NO_FLAGS; 00050 00051 slist_internal_link_element_to_head( ss, se ); 00052 } 00053 00054 return( (struct slist_element *) se ); 00055 } 00056 00057 #endif /* !HLX_BUILD_WITH_PARALLEL_THREADING */