]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.0/liblfds610/src/lfds610_slist/lfds610_slist_new.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.0 / liblfds610 / src / lfds610_slist / lfds610_slist_new.c
1 #include "lfds610_slist_internal.h"
2
3
4
5
6
7 /****************************************************************************/
8 int lfds610_slist_new( struct lfds610_slist_state **ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state )
9 {
10   int
11     rv = 0;
12
13   assert( ss != NULL );
14   // TRD : user_data_delete_function can be NULL
15   // TRD : user_state can be NULL
16
17   *ss = (struct lfds610_slist_state *) lfds610_liblfds_aligned_malloc( sizeof(struct lfds610_slist_state), LFDS610_ALIGN_SINGLE_POINTER );
18
19   if( *ss != NULL )
20   {
21     lfds610_slist_internal_init_slist( *ss, user_data_delete_function, user_state );
22     rv = 1;
23   }
24
25   LFDS610_BARRIER_STORE;
26
27   return( rv );
28 }
29
30
31
32
33
34 /****************************************************************************/
35 #pragma warning( disable : 4100 )
36
37 void lfds610_slist_use( struct lfds610_slist_state *ss )
38 {
39   assert( ss != NULL );
40
41   LFDS610_BARRIER_LOAD;
42
43   return;
44 }
45
46 #pragma warning( default : 4100 )
47
48
49
50
51
52 /****************************************************************************/
53 void lfds610_slist_internal_init_slist( struct lfds610_slist_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state )
54 {
55   assert( ss != NULL );
56   // TRD : user_data_delete_function can be NULL
57   // TRD : user_state can be NULL
58
59   ss->head = NULL;
60   ss->user_data_delete_function = user_data_delete_function;
61   ss->user_state = user_state;
62
63   return;
64 }
65
66
67
68
69
70 /****************************************************************************/
71 struct lfds610_slist_element *lfds610_slist_new_head( struct lfds610_slist_state *ss, void *user_data )
72 {
73   LFDS610_ALIGN(LFDS610_ALIGN_SINGLE_POINTER) struct lfds610_slist_element
74     *volatile se;
75
76   assert( ss != NULL );
77   // TRD : user_data can be NULL
78
79   se = (struct lfds610_slist_element *) lfds610_liblfds_aligned_malloc( sizeof(struct lfds610_slist_element), LFDS610_ALIGN_DOUBLE_POINTER );
80
81   if( se != NULL )
82   {
83     se->user_data_and_flags[LFDS610_SLIST_USER_DATA] = user_data;
84     se->user_data_and_flags[LFDS610_SLIST_FLAGS] = LFDS610_SLIST_NO_FLAGS;
85
86     lfds610_slist_internal_link_element_to_head( ss, se );
87   }
88
89   return( (struct lfds610_slist_element *) se );
90 }
91
92
93
94
95
96 /****************************************************************************/
97 struct lfds610_slist_element *lfds610_slist_new_next( struct lfds610_slist_element *se, void *user_data )
98 {
99   LFDS610_ALIGN(LFDS610_ALIGN_SINGLE_POINTER) struct lfds610_slist_element
100     *volatile se_next;
101
102   assert( se != NULL );
103   // TRD : user_data can be NULL
104
105   se_next = (struct lfds610_slist_element *) lfds610_liblfds_aligned_malloc( sizeof(struct lfds610_slist_element), LFDS610_ALIGN_DOUBLE_POINTER );
106
107   if( se_next != NULL )
108   {
109     se_next->user_data_and_flags[LFDS610_SLIST_USER_DATA] = user_data;
110     se_next->user_data_and_flags[LFDS610_SLIST_FLAGS] = LFDS610_SLIST_NO_FLAGS;
111
112     lfds610_slist_internal_link_element_after_element( se, se_next );
113   }
114
115   return( (struct lfds610_slist_element *) se_next );
116 }
117