]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.1/liblfds611/src/lfds611_stack/lfds611_stack_new.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.1 / liblfds611 / src / lfds611_stack / lfds611_stack_new.c
1 #include "lfds611_stack_internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \r
7 /****************************************************************************/\r
8 int lfds611_stack_new( struct lfds611_stack_state **ss, lfds611_atom_t number_elements )\r
9 {\r
10   int\r
11     rv = 0;\r
12 \r
13   assert( ss != NULL );\r
14   // TRD : number_elements can be any value in its range\r
15 \r
16   *ss = (struct lfds611_stack_state *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_stack_state), LFDS611_ALIGN_DOUBLE_POINTER );\r
17 \r
18   if( *ss != NULL )\r
19   {\r
20     // TRD : the size of the lfds611_freelist is the size of the lfds611_stack\r
21     lfds611_freelist_new( &(*ss)->fs, number_elements, lfds611_stack_internal_freelist_init_function, NULL );\r
22 \r
23     if( (*ss)->fs == NULL )\r
24     {\r
25       lfds611_liblfds_aligned_free( *ss );\r
26       *ss = NULL;\r
27     }\r
28 \r
29     if( (*ss)->fs != NULL )\r
30     {\r
31       (*ss)->top[LFDS611_STACK_POINTER] = NULL;\r
32       (*ss)->top[LFDS611_STACK_COUNTER] = 0;\r
33       (*ss)->aba_counter = 0;\r
34       rv = 1;\r
35     }\r
36   }\r
37 \r
38   LFDS611_BARRIER_STORE;\r
39 \r
40   return( rv );\r
41 }\r
42 \r
43 \r
44 \r
45 \r
46 \r
47 /****************************************************************************/\r
48 #pragma warning( disable : 4100 )\r
49 \r
50 void lfds611_stack_use( struct lfds611_stack_state *ss )\r
51 {\r
52   assert( ss != NULL );\r
53 \r
54   LFDS611_BARRIER_LOAD;\r
55 \r
56   return;\r
57 }\r
58 \r
59 #pragma warning( default : 4100 )\r
60 \r
61 \r
62 \r
63 \r
64 \r
65 /****************************************************************************/\r
66 #pragma warning( disable : 4100 )\r
67 \r
68 int lfds611_stack_internal_freelist_init_function( void **user_data, void *user_state )\r
69 {\r
70   int\r
71     rv = 0;\r
72 \r
73   assert( user_data != NULL );\r
74   assert( user_state == NULL );\r
75 \r
76   *user_data = lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_stack_element), LFDS611_ALIGN_DOUBLE_POINTER );\r
77 \r
78   if( *user_data != NULL )\r
79     rv = 1;\r
80 \r
81   return( rv );\r
82 }\r
83 \r
84 #pragma warning( default : 4100 )\r
85 \r
86 \r
87 \r
88 \r
89 \r
90 /****************************************************************************/\r
91 void lfds611_stack_internal_new_element_from_freelist( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE], void *user_data )\r
92 {\r
93   struct lfds611_freelist_element\r
94     *fe;\r
95 \r
96   assert( ss != NULL );\r
97   assert( se != NULL );\r
98   // TRD : user_data can be any value in its range\r
99 \r
100   lfds611_freelist_pop( ss->fs, &fe );\r
101 \r
102   if( fe == NULL )\r
103     se[LFDS611_STACK_POINTER] = NULL;\r
104 \r
105   if( fe != NULL )\r
106     lfds611_stack_internal_init_element( ss, se, fe, user_data );\r
107 \r
108   return;\r
109 }\r
110 \r
111 \r
112 \r
113 \r
114 \r
115 /****************************************************************************/\r
116 void lfds611_stack_internal_new_element( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE], void *user_data )\r
117 {\r
118   struct lfds611_freelist_element\r
119     *fe;\r
120 \r
121   assert( ss != NULL );\r
122   assert( se != NULL );\r
123   // TRD : user_data can be any value in its range\r
124 \r
125   lfds611_freelist_guaranteed_pop( ss->fs, &fe );\r
126 \r
127   if( fe == NULL )\r
128     se[LFDS611_STACK_POINTER] = NULL;\r
129 \r
130   if( fe != NULL )\r
131     lfds611_stack_internal_init_element( ss, se, fe, user_data );\r
132 \r
133   return;\r
134 }\r
135 \r
136 \r
137 \r
138 \r
139 \r
140 /****************************************************************************/\r
141 void lfds611_stack_internal_init_element( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE], struct lfds611_freelist_element *fe, void *user_data )\r
142 {\r
143   assert( ss != NULL );\r
144   assert( se != NULL );\r
145   assert( fe != NULL );\r
146   // TRD : user_data can be any value in its range\r
147 \r
148   lfds611_freelist_get_user_data_from_element( fe, (void **) &se[LFDS611_STACK_POINTER] );\r
149 \r
150   se[LFDS611_STACK_COUNTER] = (struct lfds611_stack_element *) lfds611_abstraction_increment( (lfds611_atom_t *) &ss->aba_counter );\r
151 \r
152   se[LFDS611_STACK_POINTER]->next[LFDS611_STACK_POINTER] = NULL;\r
153   se[LFDS611_STACK_POINTER]->next[LFDS611_STACK_COUNTER] = 0;\r
154   se[LFDS611_STACK_POINTER]->fe = fe;\r
155   se[LFDS611_STACK_POINTER]->user_data = user_data;\r
156 \r
157   return;\r
158 }\r
159 \r