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