]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_new.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.1 / liblfds611 / src / lfds611_slist / lfds611_slist_new.c
1 #include "lfds611_slist_internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \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
9 {\r
10   int\r
11     rv = 0;\r
12 \r
13   assert( ss != NULL );\r
14   // TRD : user_data_delete_function can be NULL\r
15   // TRD : user_state can be NULL\r
16 \r
17   *ss = (struct lfds611_slist_state *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_slist_state), LFDS611_ALIGN_SINGLE_POINTER );\r
18 \r
19   if( *ss != NULL )\r
20   {\r
21     lfds611_slist_internal_init_slist( *ss, user_data_delete_function, user_state );\r
22     rv = 1;\r
23   }\r
24 \r
25   LFDS611_BARRIER_STORE;\r
26 \r
27   return( rv );\r
28 }\r
29 \r
30 \r
31 \r
32 \r
33 \r
34 /****************************************************************************/\r
35 #pragma warning( disable : 4100 )\r
36 \r
37 void lfds611_slist_use( struct lfds611_slist_state *ss )\r
38 {\r
39   assert( ss != NULL );\r
40 \r
41   LFDS611_BARRIER_LOAD;\r
42 \r
43   return;\r
44 }\r
45 \r
46 #pragma warning( default : 4100 )\r
47 \r
48 \r
49 \r
50 \r
51 \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
54 {\r
55   assert( ss != NULL );\r
56   // TRD : user_data_delete_function can be NULL\r
57   // TRD : user_state can be NULL\r
58 \r
59   ss->head = NULL;\r
60   ss->user_data_delete_function = user_data_delete_function;\r
61   ss->user_state = user_state;\r
62 \r
63   return;\r
64 }\r
65 \r
66 \r
67 \r
68 \r
69 \r
70 /****************************************************************************/\r
71 struct lfds611_slist_element *lfds611_slist_new_head( struct lfds611_slist_state *ss, void *user_data )\r
72 {\r
73   LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) struct lfds611_slist_element\r
74     *volatile se;\r
75 \r
76   assert( ss != NULL );\r
77   // TRD : user_data can be NULL\r
78 \r
79   se = (struct lfds611_slist_element *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_slist_element), LFDS611_ALIGN_DOUBLE_POINTER );\r
80 \r
81   if( se != NULL )\r
82   {\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
85 \r
86     lfds611_slist_internal_link_element_to_head( ss, se );\r
87   }\r
88 \r
89   return( (struct lfds611_slist_element *) se );\r
90 }\r
91 \r
92 \r
93 \r
94 \r
95 \r
96 /****************************************************************************/\r
97 struct lfds611_slist_element *lfds611_slist_new_next( struct lfds611_slist_element *se, void *user_data )\r
98 {\r
99   LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) struct lfds611_slist_element\r
100     *volatile se_next;\r
101 \r
102   assert( se != NULL );\r
103   // TRD : user_data can be NULL\r
104 \r
105   se_next = (struct lfds611_slist_element *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_slist_element), LFDS611_ALIGN_DOUBLE_POINTER );\r
106 \r
107   if( se_next != NULL )\r
108   {\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
111 \r
112     lfds611_slist_internal_link_element_after_element( se, se_next );\r
113   }\r
114 \r
115   return( (struct lfds611_slist_element *) se_next );\r
116 }\r
117 \r