]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.0.0/liblfds600/src/lfds600_stack/lfds600_stack_new.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.0.0 / liblfds600 / src / lfds600_stack / lfds600_stack_new.c
1 #include "lfds600_stack_internal.h"
2
3
4
5
6
7 /****************************************************************************/
8 int lfds600_stack_new( struct lfds600_stack_state **ss, lfds600_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 lfds600_stack_state *) lfds600_abstraction_aligned_malloc( sizeof(struct lfds600_stack_state), LFDS600_ALIGN_DOUBLE_POINTER );
17
18   if( *ss != NULL )
19   {
20     // TRD : the size of the lfds600_freelist is the size of the lfds600_stack
21     lfds600_freelist_new( &(*ss)->fs, number_elements, lfds600_stack_internal_freelist_init_function, NULL );
22
23     if( (*ss)->fs == NULL )
24     {
25       lfds600_abstraction_aligned_free( *ss );
26       *ss = NULL;
27     }
28
29     if( (*ss)->fs != NULL )
30     {
31       (*ss)->top[LFDS600_STACK_POINTER] = NULL;
32       (*ss)->top[LFDS600_STACK_COUNTER] = 0;
33       (*ss)->aba_counter = 0;
34       rv = 1;
35     }
36   }
37
38   return( rv );
39 }
40
41
42
43
44
45 /****************************************************************************/
46 #pragma warning( disable : 4100 )
47
48 int lfds600_stack_internal_freelist_init_function( void **user_data, void *user_state )
49 {
50   int
51     rv = 0;
52
53   assert( user_data != NULL );
54   assert( user_state == NULL );
55
56   *user_data = lfds600_abstraction_aligned_malloc( sizeof(struct lfds600_stack_element), LFDS600_ALIGN_DOUBLE_POINTER );
57
58   if( *user_data != NULL )
59     rv = 1;
60
61   return( rv );
62 }
63
64 #pragma warning( default : 4100 )
65
66
67
68
69
70 /****************************************************************************/
71 void lfds600_stack_internal_new_element_from_freelist( struct lfds600_stack_state *ss, struct lfds600_stack_element *se[LFDS600_STACK_PAC_SIZE], void *user_data )
72 {
73   struct lfds600_freelist_element
74     *fe;
75
76   assert( ss != NULL );
77   assert( se != NULL );
78   // TRD : user_data can be any value in its range
79
80   lfds600_freelist_pop( ss->fs, &fe );
81
82   if( fe == NULL )
83     se[LFDS600_STACK_POINTER] = NULL;
84
85   if( fe != NULL )
86     lfds600_stack_internal_init_element( ss, se, fe, user_data );
87
88   return;
89 }
90
91
92
93
94
95 /****************************************************************************/
96 void lfds600_stack_internal_new_element( struct lfds600_stack_state *ss, struct lfds600_stack_element *se[LFDS600_STACK_PAC_SIZE], void *user_data )
97 {
98   struct lfds600_freelist_element
99     *fe;
100
101   assert( ss != NULL );
102   assert( se != NULL );
103   // TRD : user_data can be any value in its range
104
105   lfds600_freelist_guaranteed_pop( ss->fs, &fe );
106
107   if( fe == NULL )
108     se[LFDS600_STACK_POINTER] = NULL;
109
110   if( fe != NULL )
111     lfds600_stack_internal_init_element( ss, se, fe, user_data );
112
113   return;
114 }
115
116
117
118
119
120 /****************************************************************************/
121 void lfds600_stack_internal_init_element( struct lfds600_stack_state *ss, struct lfds600_stack_element *se[LFDS600_STACK_PAC_SIZE], struct lfds600_freelist_element *fe, void *user_data )
122 {
123   assert( ss != NULL );
124   assert( se != NULL );
125   assert( fe != NULL );
126   // TRD : user_data can be any value in its range
127
128   lfds600_freelist_get_user_data_from_element( fe, (void **) &se[LFDS600_STACK_POINTER] );
129
130   se[LFDS600_STACK_COUNTER] = (struct lfds600_stack_element *) lfds600_abstraction_increment( (lfds600_atom_t *) &ss->aba_counter );
131
132   se[LFDS600_STACK_POINTER]->next[LFDS600_STACK_POINTER] = NULL;
133   se[LFDS600_STACK_POINTER]->next[LFDS600_STACK_COUNTER] = 0;
134   se[LFDS600_STACK_POINTER]->fe = fe;
135   se[LFDS600_STACK_POINTER]->user_data = user_data;
136
137   return;
138 }
139