]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.0.1/liblfds601/src/lfds601_freelist/lfds601_freelist_new.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.0.1 / liblfds601 / src / lfds601_freelist / lfds601_freelist_new.c
1 #include "lfds601_freelist_internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \r
7 /****************************************************************************/\r
8 int lfds601_freelist_new( struct lfds601_freelist_state **fs, lfds601_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   lfds601_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 lfds601_freelist_state *) lfds601_abstraction_aligned_malloc( sizeof(struct lfds601_freelist_state), LFDS601_ALIGN_DOUBLE_POINTER );\r
21 \r
22   if( (*fs) != NULL )\r
23   {\r
24     (*fs)->top[LFDS601_FREELIST_POINTER] = NULL;\r
25     (*fs)->top[LFDS601_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 = lfds601_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       lfds601_abstraction_aligned_free( (*fs) );\r
39       *fs = NULL;\r
40     }\r
41   }\r
42 \r
43   return( rv );\r
44 }\r
45 \r
46 \r
47 \r
48 \r
49 \r
50 /****************************************************************************/\r
51 lfds601_atom_t lfds601_freelist_new_elements( struct lfds601_freelist_state *fs, lfds601_atom_t number_elements )\r
52 {\r
53   struct lfds601_freelist_element\r
54     *fe;\r
55 \r
56   lfds601_atom_t\r
57     loop,\r
58     count = 0;\r
59 \r
60   assert( fs != NULL );\r
61   // TRD : number_elements can be any value in its range\r
62   // TRD : user_data_init_function can be NULL\r
63 \r
64   for( loop = 0 ; loop < number_elements ; loop++ )\r
65     if( lfds601_freelist_internal_new_element(fs, &fe) )\r
66     {\r
67       lfds601_freelist_push( fs, fe );\r
68       count++;\r
69     }\r
70 \r
71   return( count );\r
72 }\r
73 \r
74 \r
75 \r
76 \r
77 \r
78 /****************************************************************************/\r
79 lfds601_atom_t lfds601_freelist_internal_new_element( struct lfds601_freelist_state *fs, struct lfds601_freelist_element **fe )\r
80 {\r
81   lfds601_atom_t\r
82     rv = 0;\r
83 \r
84   assert( fs != NULL );\r
85   assert( fe != NULL );\r
86 \r
87   /* TRD : basically, does what you'd expect;\r
88 \r
89            allocates an element\r
90            calls the user init function\r
91            if anything fails, cleans up,\r
92            sets *fe to NULL\r
93            and returns 0\r
94   */\r
95 \r
96   *fe = (struct lfds601_freelist_element *) lfds601_abstraction_aligned_malloc( sizeof(struct lfds601_freelist_element), LFDS601_ALIGN_DOUBLE_POINTER );\r
97 \r
98   if( *fe != NULL )\r
99   {\r
100     if( fs->user_data_init_function == NULL )\r
101     {\r
102       (*fe)->user_data = NULL;\r
103       rv = 1;\r
104     }\r
105 \r
106     if( fs->user_data_init_function != NULL )\r
107     {\r
108       rv = fs->user_data_init_function( &(*fe)->user_data, fs->user_state );\r
109 \r
110       if( rv == 0 )\r
111       {\r
112         lfds601_abstraction_aligned_free( *fe );\r
113         *fe = NULL;\r
114       }\r
115     }\r
116   }\r
117 \r
118   if( rv == 1 )\r
119     lfds601_abstraction_increment( (lfds601_atom_t *) &fs->element_count );\r
120 \r
121   return( rv );\r
122 }\r
123 \r