![]() |
Helixis 1.0
Task Programming API
|
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 */