1 #include "lfds611_slist_internal.h"
\r
7 /****************************************************************************/
\r
8 int lfds611_slist_new( struct lfds611_slist_state **ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state )
\r
13 assert( ss != NULL );
\r
14 // TRD : user_data_delete_function can be NULL
\r
15 // TRD : user_state can be NULL
\r
17 *ss = (struct lfds611_slist_state *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_slist_state), LFDS611_ALIGN_SINGLE_POINTER );
\r
21 lfds611_slist_internal_init_slist( *ss, user_data_delete_function, user_state );
\r
25 LFDS611_BARRIER_STORE;
\r
34 /****************************************************************************/
\r
35 #pragma warning( disable : 4100 )
\r
37 void lfds611_slist_use( struct lfds611_slist_state *ss )
\r
39 assert( ss != NULL );
\r
41 LFDS611_BARRIER_LOAD;
\r
46 #pragma warning( default : 4100 )
\r
52 /****************************************************************************/
\r
53 void lfds611_slist_internal_init_slist( struct lfds611_slist_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state )
\r
55 assert( ss != NULL );
\r
56 // TRD : user_data_delete_function can be NULL
\r
57 // TRD : user_state can be NULL
\r
60 ss->user_data_delete_function = user_data_delete_function;
\r
61 ss->user_state = user_state;
\r
70 /****************************************************************************/
\r
71 struct lfds611_slist_element *lfds611_slist_new_head( struct lfds611_slist_state *ss, void *user_data )
\r
73 LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) struct lfds611_slist_element
\r
76 assert( ss != NULL );
\r
77 // TRD : user_data can be NULL
\r
79 se = (struct lfds611_slist_element *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_slist_element), LFDS611_ALIGN_DOUBLE_POINTER );
\r
83 se->user_data_and_flags[LFDS611_SLIST_USER_DATA] = user_data;
\r
84 se->user_data_and_flags[LFDS611_SLIST_FLAGS] = LFDS611_SLIST_NO_FLAGS;
\r
86 lfds611_slist_internal_link_element_to_head( ss, se );
\r
89 return( (struct lfds611_slist_element *) se );
\r
96 /****************************************************************************/
\r
97 struct lfds611_slist_element *lfds611_slist_new_next( struct lfds611_slist_element *se, void *user_data )
\r
99 LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) struct lfds611_slist_element
\r
102 assert( se != NULL );
\r
103 // TRD : user_data can be NULL
\r
105 se_next = (struct lfds611_slist_element *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_slist_element), LFDS611_ALIGN_DOUBLE_POINTER );
\r
107 if( se_next != NULL )
\r
109 se_next->user_data_and_flags[LFDS611_SLIST_USER_DATA] = user_data;
\r
110 se_next->user_data_and_flags[LFDS611_SLIST_FLAGS] = LFDS611_SLIST_NO_FLAGS;
\r
112 lfds611_slist_internal_link_element_after_element( se, se_next );
\r
115 return( (struct lfds611_slist_element *) se_next );
\r