]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.0.1/liblfds601/src/lfds601_stack/lfds601_stack_new.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.0.1 / liblfds601 / src / lfds601_stack / lfds601_stack_new.c
1 #include "lfds601_stack_internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \r
7 /****************************************************************************/\r
8 int lfds601_stack_new( struct lfds601_stack_state **ss, lfds601_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 lfds601_stack_state *) lfds601_abstraction_aligned_malloc( sizeof(struct lfds601_stack_state), LFDS601_ALIGN_DOUBLE_POINTER );\r
17 \r
18   if( *ss != NULL )\r
19   {\r
20     // TRD : the size of the lfds601_freelist is the size of the lfds601_stack\r
21     lfds601_freelist_new( &(*ss)->fs, number_elements, lfds601_stack_internal_freelist_init_function, NULL );\r
22 \r
23     if( (*ss)->fs == NULL )\r
24     {\r
25       lfds601_abstraction_aligned_free( *ss );\r
26       *ss = NULL;\r
27     }\r
28 \r
29     if( (*ss)->fs != NULL )\r
30     {\r
31       (*ss)->top[LFDS601_STACK_POINTER] = NULL;\r
32       (*ss)->top[LFDS601_STACK_COUNTER] = 0;\r
33       (*ss)->aba_counter = 0;\r
34       rv = 1;\r
35     }\r
36   }\r
37 \r
38   return( rv );\r
39 }\r
40 \r
41 \r
42 \r
43 \r
44 \r
45 /****************************************************************************/\r
46 #pragma warning( disable : 4100 )\r
47 \r
48 int lfds601_stack_internal_freelist_init_function( void **user_data, void *user_state )\r
49 {\r
50   int\r
51     rv = 0;\r
52 \r
53   assert( user_data != NULL );\r
54   assert( user_state == NULL );\r
55 \r
56   *user_data = lfds601_abstraction_aligned_malloc( sizeof(struct lfds601_stack_element), LFDS601_ALIGN_DOUBLE_POINTER );\r
57 \r
58   if( *user_data != NULL )\r
59     rv = 1;\r
60 \r
61   return( rv );\r
62 }\r
63 \r
64 #pragma warning( default : 4100 )\r
65 \r
66 \r
67 \r
68 \r
69 \r
70 /****************************************************************************/\r
71 void lfds601_stack_internal_new_element_from_freelist( struct lfds601_stack_state *ss, struct lfds601_stack_element *se[LFDS601_STACK_PAC_SIZE], void *user_data )\r
72 {\r
73   struct lfds601_freelist_element\r
74     *fe;\r
75 \r
76   assert( ss != NULL );\r
77   assert( se != NULL );\r
78   // TRD : user_data can be any value in its range\r
79 \r
80   lfds601_freelist_pop( ss->fs, &fe );\r
81 \r
82   if( fe == NULL )\r
83     se[LFDS601_STACK_POINTER] = NULL;\r
84 \r
85   if( fe != NULL )\r
86     lfds601_stack_internal_init_element( ss, se, fe, user_data );\r
87 \r
88   return;\r
89 }\r
90 \r
91 \r
92 \r
93 \r
94 \r
95 /****************************************************************************/\r
96 void lfds601_stack_internal_new_element( struct lfds601_stack_state *ss, struct lfds601_stack_element *se[LFDS601_STACK_PAC_SIZE], void *user_data )\r
97 {\r
98   struct lfds601_freelist_element\r
99     *fe;\r
100 \r
101   assert( ss != NULL );\r
102   assert( se != NULL );\r
103   // TRD : user_data can be any value in its range\r
104 \r
105   lfds601_freelist_guaranteed_pop( ss->fs, &fe );\r
106 \r
107   if( fe == NULL )\r
108     se[LFDS601_STACK_POINTER] = NULL;\r
109 \r
110   if( fe != NULL )\r
111     lfds601_stack_internal_init_element( ss, se, fe, user_data );\r
112 \r
113   return;\r
114 }\r
115 \r
116 \r
117 \r
118 \r
119 \r
120 /****************************************************************************/\r
121 void lfds601_stack_internal_init_element( struct lfds601_stack_state *ss, struct lfds601_stack_element *se[LFDS601_STACK_PAC_SIZE], struct lfds601_freelist_element *fe, void *user_data )\r
122 {\r
123   assert( ss != NULL );\r
124   assert( se != NULL );\r
125   assert( fe != NULL );\r
126   // TRD : user_data can be any value in its range\r
127 \r
128   lfds601_freelist_get_user_data_from_element( fe, (void **) &se[LFDS601_STACK_POINTER] );\r
129 \r
130   se[LFDS601_STACK_COUNTER] = (struct lfds601_stack_element *) lfds601_abstraction_increment( (lfds601_atom_t *) &ss->aba_counter );\r
131 \r
132   se[LFDS601_STACK_POINTER]->next[LFDS601_STACK_POINTER] = NULL;\r
133   se[LFDS601_STACK_POINTER]->next[LFDS601_STACK_COUNTER] = 0;\r
134   se[LFDS601_STACK_POINTER]->fe = fe;\r
135   se[LFDS601_STACK_POINTER]->user_data = user_data;\r
136 \r
137   return;\r
138 }\r
139 \r