Helixis 1.0
Task Programming API
sources/liblfds/freelist/freelist_new.c
Go to the documentation of this file.
00001 #include "freelist_internal.h"
00002 
00003 #if defined(HLX_BUILD_WITH_PARALLEL_THREADING)
00004 
00005 extern hlx_api gl_api;
00006 
00007 /****************************************************************************/
00008 int freelist_new( struct freelist_state **fs, atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state )
00009 {
00010   int
00011     rv = 0;
00012 
00013   atom_t
00014     element_count;
00015 
00016   /* TRD : number_elements can be any value in its range */
00017   /* TRD : user_data_init_function can be 0 */
00018 
00019   *fs = (struct freelist_state *) gl_api.aligned_malloc_entry( sizeof(struct freelist_state), ALIGN_DOUBLE_POINTER );
00020 
00021   if( (*fs) != 0 )
00022   {
00023     (*fs)->top[FREELIST_POINTER] = 0;
00024     (*fs)->top[FREELIST_COUNTER] = 0;
00025     (*fs)->user_data_init_function = user_data_init_function;
00026     (*fs)->user_state = user_state;
00027     (*fs)->aba_counter = 0;
00028     (*fs)->element_count = 0;
00029 
00030     element_count = freelist_new_elements( *fs, number_elements );
00031 
00032     if( element_count == number_elements )
00033       rv = 1;
00034 
00035     if( element_count != number_elements )
00036     {
00037       gl_api.aligned_free_entry( (*fs) );
00038       *fs = 0;
00039     }
00040   }
00041 
00042   return( rv );
00043 }
00044 
00045 
00046 
00047 
00048 
00049 /****************************************************************************/
00050 atom_t freelist_new_elements( struct freelist_state *fs, atom_t number_elements )
00051 {
00052   struct freelist_element
00053     *fe;
00054 
00055   atom_t
00056     loop,
00057     count = 0;
00058 
00059   /* TRD : number_elements can be any value in its range */
00060   /* TRD : user_data_init_function can be 0 */
00061 
00062   for( loop = 0 ; loop < number_elements ; loop++ )
00063     if( freelist_internal_new_element(fs, &fe) )
00064     {
00065       freelist_push( fs, fe );
00066       count++;
00067     }
00068 
00069   return( count );
00070 }
00071 
00072 
00073 
00074 
00075 
00076 /****************************************************************************/
00077 atom_t freelist_internal_new_element( struct freelist_state *fs, struct freelist_element **fe )
00078 {
00079   atom_t
00080     rv = 0;
00081 
00082   /* TRD : basically, does what you'd expect;
00083 
00084            allocates an element
00085            calls the user init function
00086            if anything fails, cleans up,
00087            sets *fe to 0
00088            and returns 0
00089   */
00090 
00091   *fe = (struct freelist_element *) gl_api.aligned_malloc_entry( sizeof(struct freelist_element), ALIGN_DOUBLE_POINTER );
00092 
00093   if( *fe != 0 )
00094   {
00095     if( fs->user_data_init_function == 0 )
00096     {
00097       (*fe)->user_data = 0;
00098       rv = 1;
00099     }
00100 
00101     if( fs->user_data_init_function != 0 )
00102     {
00103       rv = fs->user_data_init_function( &(*fe)->user_data, fs->user_state );
00104 
00105       if( rv == 0 )
00106       {
00107         gl_api.aligned_free_entry( *fe );
00108         *fe = 0;
00109       }
00110     }
00111   }
00112 
00113   if( rv == 1 )
00114   {
00115     gl_api.atomic_incr_entry( (atom_t *) &fs->element_count );
00116   }
00117 
00118   return( rv );
00119 }
00120 
00121 #endif /* !HLX_BUILD_WITH_PARALLEL_THREADING */
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines