]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.1/liblfds611/src/lfds611_freelist/lfds611_freelist_new.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.1 / liblfds611 / src / lfds611_freelist / lfds611_freelist_new.c
1 #include "lfds611_freelist_internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \r
7 /****************************************************************************/\r
8 int lfds611_freelist_new( struct lfds611_freelist_state **fs, lfds611_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state )\r
9 {\r
10   int\r
11     rv = 0;\r
12 \r
13   lfds611_atom_t\r
14     element_count;\r
15 \r
16   assert( fs != NULL );\r
17   // TRD : number_elements can be any value in its range\r
18   // TRD : user_data_init_function can be NULL\r
19 \r
20   *fs = (struct lfds611_freelist_state *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_freelist_state), LFDS611_ALIGN_DOUBLE_POINTER );\r
21 \r
22   if( (*fs) != NULL )\r
23   {\r
24     (*fs)->top[LFDS611_FREELIST_POINTER] = NULL;\r
25     (*fs)->top[LFDS611_FREELIST_COUNTER] = 0;\r
26     (*fs)->user_data_init_function = user_data_init_function;\r
27     (*fs)->user_state = user_state;\r
28     (*fs)->aba_counter = 0;\r
29     (*fs)->element_count = 0;\r
30 \r
31     element_count = lfds611_freelist_new_elements( *fs, number_elements );\r
32 \r
33     if( element_count == number_elements )\r
34       rv = 1;\r
35 \r
36     if( element_count != number_elements )\r
37     {\r
38       lfds611_liblfds_aligned_free( (*fs) );\r
39       *fs = NULL;\r
40     }\r
41   }\r
42 \r
43   LFDS611_BARRIER_STORE;\r
44 \r
45   return( rv );\r
46 }\r
47 \r
48 \r
49 \r
50 \r
51 \r
52 /****************************************************************************/\r
53 #pragma warning( disable : 4100 )\r
54 \r
55 void lfds611_freelist_use( struct lfds611_freelist_state *fs )\r
56 {\r
57   assert( fs != NULL );\r
58 \r
59   LFDS611_BARRIER_LOAD;\r
60 \r
61   return;\r
62 }\r
63 \r
64 #pragma warning( default : 4100 )\r
65 \r
66 \r
67 \r
68 \r
69 \r
70 /****************************************************************************/\r
71 lfds611_atom_t lfds611_freelist_new_elements( struct lfds611_freelist_state *fs, lfds611_atom_t number_elements )\r
72 {\r
73   struct lfds611_freelist_element\r
74     *fe;\r
75 \r
76   lfds611_atom_t\r
77     loop,\r
78     count = 0;\r
79 \r
80   assert( fs != NULL );\r
81   // TRD : number_elements can be any value in its range\r
82   // TRD : user_data_init_function can be NULL\r
83 \r
84   for( loop = 0 ; loop < number_elements ; loop++ )\r
85     if( lfds611_freelist_internal_new_element(fs, &fe) )\r
86     {\r
87       lfds611_freelist_push( fs, fe );\r
88       count++;\r
89     }\r
90 \r
91   return( count );\r
92 }\r
93 \r
94 \r
95 \r
96 \r
97 \r
98 /****************************************************************************/\r
99 lfds611_atom_t lfds611_freelist_internal_new_element( struct lfds611_freelist_state *fs, struct lfds611_freelist_element **fe )\r
100 {\r
101   lfds611_atom_t\r
102     rv = 0;\r
103 \r
104   assert( fs != NULL );\r
105   assert( fe != NULL );\r
106 \r
107   /* TRD : basically, does what you'd expect;\r
108 \r
109            allocates an element\r
110            calls the user init function\r
111            if anything fails, cleans up,\r
112            sets *fe to NULL\r
113            and returns 0\r
114   */\r
115 \r
116   *fe = (struct lfds611_freelist_element *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_freelist_element), LFDS611_ALIGN_DOUBLE_POINTER );\r
117 \r
118   if( *fe != NULL )\r
119   {\r
120     if( fs->user_data_init_function == NULL )\r
121     {\r
122       (*fe)->user_data = NULL;\r
123       rv = 1;\r
124     }\r
125 \r
126     if( fs->user_data_init_function != NULL )\r
127     {\r
128       rv = fs->user_data_init_function( &(*fe)->user_data, fs->user_state );\r
129 \r
130       if( rv == 0 )\r
131       {\r
132         lfds611_liblfds_aligned_free( *fe );\r
133         *fe = NULL;\r
134       }\r
135     }\r
136   }\r
137 \r
138   if( rv == 1 )\r
139     lfds611_abstraction_increment( (lfds611_atom_t *) &fs->element_count );\r
140 \r
141   return( rv );\r
142 }\r
143 \r