![]() |
Helixis 1.0
Task Programming API
|
Go to the source code of this file.
Data Structures | |
| struct | validation_info |
Defines | |
| #define | __LIBLFDS_H |
| #define | LIBLFDS_RELEASE_NUMBER 6 |
| #define | __LIBLFDS_H |
Enumerations | |
| enum | data_structure_validity { VALIDITY_VALID, VALIDITY_INVALID_LOOP, VALIDITY_INVALID_MISSING_ELEMENTS, VALIDITY_INVALID_ADDITIONAL_ELEMENTS, VALIDITY_INVALID_TEST_DATA } |
| enum | freelist_query_type { FREELIST_QUERY_ELEMENT_COUNT, FREELIST_QUERY_VALIDATE } |
| enum | queue_query_type { QUEUE_QUERY_ELEMENT_COUNT, QUEUE_QUERY_VALIDATE } |
Functions | |
| 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) |
| void | freelist_delete (struct freelist_state *fs, void(*user_data_delete_function)(void *user_data, void *user_state), void *user_state) |
| atom_t | freelist_new_elements (struct freelist_state *fs, atom_t number_elements) |
| struct freelist_element * | freelist_pop (struct freelist_state *fs, struct freelist_element **fe) |
| struct freelist_element * | freelist_guaranteed_pop (struct freelist_state *fs, struct freelist_element **fe) |
| void | freelist_push (struct freelist_state *fs, struct freelist_element *fe) |
| void * | freelist_get_user_data_from_element (struct freelist_element *fe, void **user_data) |
| void | freelist_set_user_data_in_element (struct freelist_element *fe, void *user_data) |
| void | freelist_query (struct freelist_state *fs, enum freelist_query_type query_type, void *query_input, void *query_output) |
| int | queue_new (struct queue_state **sq, atom_t number_elements) |
| void | queue_delete (struct queue_state *qs, void(*user_data_delete_function)(void *user_data, void *user_state), void *user_state) |
| int | queue_enqueue (struct queue_state *qs, void *user_data) |
| int | queue_guaranteed_enqueue (struct queue_state *qs, void *user_data) |
| int | queue_dequeue (struct queue_state *qs, void **user_data) |
| void | queue_query (struct queue_state *qs, enum queue_query_type query_type, void *query_input, void *query_output) |
| int | slist_new (struct slist_state **ss, void(*user_data_delete_function)(void *user_data, void *user_state), void *user_state) |
| void | slist_delete (struct slist_state *ss) |
| struct slist_element * | slist_new_head (struct slist_state *ss, void *user_data) |
| struct slist_element * | slist_new_next (struct slist_element *se, void *user_data) |
| void | slist_delete_element (struct slist_state *ss, struct slist_element *se) |
| void | slist_delete_all_elements (struct slist_state *ss) |
| int | slist_get_user_data_from_element (struct slist_element *se, void **user_data) |
| int | slist_set_user_data_in_element (struct slist_element *se, void *user_data) |
| struct slist_element * | slist_get_head (struct slist_state *ss, struct slist_element **se) |
| struct slist_element * | slist_get_next (struct slist_element *se, struct slist_element **next_se) |
| struct slist_element * | slist_get_head_and_then_next (struct slist_state *ss, struct slist_element **se) |
| enum freelist_query_type |
| enum queue_query_type |
| void freelist_delete | ( | struct freelist_state * | fs, |
| void(*)(void *user_data, void *user_state) | user_data_delete_function, | ||
| void * | user_state | ||
| ) |
Referenced by queue_delete().
| void* freelist_get_user_data_from_element | ( | struct freelist_element * | fe, |
| void ** | user_data | ||
| ) |
Referenced by queue_internal_init_element().
| struct freelist_element* freelist_guaranteed_pop | ( | struct freelist_state * | fs, |
| struct freelist_element ** | fe | ||
| ) | [read] |
Referenced by queue_internal_guaranteed_new_element_from_freelist().
| int freelist_new | ( | struct freelist_state ** | fs, |
| atom_t | number_elements, | ||
| int(*)(void **user_data, void *user_state) | user_data_init_function, | ||
| void * | user_state | ||
| ) |
Referenced by queue_new().
| struct freelist_element* freelist_pop | ( | struct freelist_state * | fs, |
| struct freelist_element ** | fe | ||
| ) | [read] |
Referenced by queue_internal_new_element_from_freelist().
| void freelist_push | ( | struct freelist_state * | fs, |
| struct freelist_element * | fe | ||
| ) |
Referenced by queue_delete(), and queue_dequeue().
| void freelist_query | ( | struct freelist_state * | fs, |
| enum freelist_query_type | query_type, | ||
| void * | query_input, | ||
| void * | query_output | ||
| ) |
Referenced by queue_internal_validate(), and queue_query().
| void freelist_set_user_data_in_element | ( | struct freelist_element * | fe, |
| void * | user_data | ||
| ) |
| void queue_delete | ( | struct queue_state * | qs, |
| void(*)(void *user_data, void *user_state) | user_data_delete_function, | ||
| void * | user_state | ||
| ) |
Definition at line 8 of file queue_delete.c.
References hlx_api::aligned_free_entry, queue_state::enqueue, queue_element::fe, freelist_delete(), freelist_push(), queue_state::fs, queue_dequeue(), queue_internal_freelist_delete_function(), and QUEUE_POINTER.
Referenced by hlx_group_destruct().
{
void
*user_data;
/* TRD : user_data_delete_function can be 0 */
/* TRD : user_state can be 0 */
while( queue_dequeue(qs, &user_data) )
if( user_data_delete_function != 0 )
user_data_delete_function( user_data, user_state );
/* TRD : fully dequeuing will leave us
with a single dummy element
which both qs->enqueue and qs->dequeue point at
we push this back onto the freelist
before we delete the freelist
*/
freelist_push( qs->fs, qs->enqueue[QUEUE_POINTER]->fe );
freelist_delete( qs->fs, queue_internal_freelist_delete_function, 0 );
gl_api.aligned_free_entry( qs );
return;
}
| int queue_dequeue | ( | struct queue_state * | qs, |
| void ** | user_data | ||
| ) |
Definition at line 101 of file queue_queue.c.
References ALIGN, ALIGN_DOUBLE_POINTER, and, hlx_api::atomic_dcas_entry, queue_state::dequeue, queue_state::enqueue, queue_element::fe, freelist_push(), queue_state::fs, LOWERED, queue_element::next, QUEUE_COUNTER, QUEUE_PAC_SIZE, QUEUE_POINTER, QUEUE_STATE_ATTEMPT_DEQUEUE, QUEUE_STATE_EMPTY, QUEUE_STATE_ENQUEUE_OUT_OF_PLACE, QUEUE_STATE_UNKNOWN, and RAISED.
Referenced by hlx_group_destruct(), hlx_group_flush_task_buffer(), and queue_delete().
{
ALIGN(ALIGN_DOUBLE_POINTER) struct queue_element
*enqueue[QUEUE_PAC_SIZE],
*dequeue[QUEUE_PAC_SIZE],
*next[QUEUE_PAC_SIZE];
unsigned char
cas_result = 0;
int
rv = 1,
state = QUEUE_STATE_UNKNOWN,
finished_flag = LOWERED;
do
{
dequeue[QUEUE_POINTER] = qs->dequeue[QUEUE_POINTER];
dequeue[QUEUE_COUNTER] = qs->dequeue[QUEUE_COUNTER];
enqueue[QUEUE_POINTER] = qs->enqueue[QUEUE_POINTER];
enqueue[QUEUE_COUNTER] = qs->enqueue[QUEUE_COUNTER];
next[QUEUE_POINTER] = dequeue[QUEUE_POINTER]->next[QUEUE_POINTER];
next[QUEUE_COUNTER] = dequeue[QUEUE_POINTER]->next[QUEUE_COUNTER];
/* TRD : confirm that dequeue didn't move between reading it
and reading its next pointer
*/
if( dequeue[QUEUE_POINTER] == qs->dequeue[QUEUE_POINTER] and dequeue[QUEUE_COUNTER] == qs->dequeue[QUEUE_COUNTER] )
{
if( enqueue[QUEUE_POINTER] == dequeue[QUEUE_POINTER] and next[QUEUE_POINTER] == 0 )
state = QUEUE_STATE_EMPTY;
if( enqueue[QUEUE_POINTER] == dequeue[QUEUE_POINTER] and next[QUEUE_POINTER] != 0 )
state = QUEUE_STATE_ENQUEUE_OUT_OF_PLACE;
if( enqueue[QUEUE_POINTER] != dequeue[QUEUE_POINTER] )
state = QUEUE_STATE_ATTEMPT_DEQUEUE;
switch( state )
{
case QUEUE_STATE_EMPTY:
*user_data = 0;
rv = 0;
finished_flag = RAISED;
break;
case QUEUE_STATE_ENQUEUE_OUT_OF_PLACE:
next[QUEUE_COUNTER] = enqueue[QUEUE_COUNTER] + 1;
gl_api.atomic_dcas_entry( (volatile atom_t *) qs->enqueue, (atom_t *) next, (atom_t *) enqueue );
break;
case QUEUE_STATE_ATTEMPT_DEQUEUE:
*user_data = next[QUEUE_POINTER]->user_data;
next[QUEUE_COUNTER] = dequeue[QUEUE_COUNTER] + 1;
cas_result = gl_api.atomic_dcas_entry( (volatile atom_t *) qs->dequeue, (atom_t *) next, (atom_t *) dequeue );
if( cas_result == 1 )
finished_flag = RAISED;
break;
}
}
}
while( finished_flag == LOWERED );
if( cas_result == 1 )
freelist_push( qs->fs, dequeue[QUEUE_POINTER]->fe );
return( rv );
}
| int queue_enqueue | ( | struct queue_state * | qs, |
| void * | user_data | ||
| ) |
Definition at line 8 of file queue_queue.c.
References ALIGN, ALIGN_DOUBLE_POINTER, queue_internal_new_element_from_freelist(), queue_internal_queue(), QUEUE_PAC_SIZE, and QUEUE_POINTER.
Referenced by hlx_group_bufferize_task().
{
ALIGN(ALIGN_DOUBLE_POINTER) struct queue_element
*qe[QUEUE_PAC_SIZE];
/* TRD : user_data can be 0 */
queue_internal_new_element_from_freelist( qs, qe, user_data );
if( qe[QUEUE_POINTER] == 0 )
return( 0 );
queue_internal_queue( qs, qe );
return( 1 );
}
| int queue_guaranteed_enqueue | ( | struct queue_state * | qs, |
| void * | user_data | ||
| ) |
Definition at line 30 of file queue_queue.c.
References ALIGN, ALIGN_DOUBLE_POINTER, queue_internal_guaranteed_new_element_from_freelist(), queue_internal_queue(), QUEUE_PAC_SIZE, and QUEUE_POINTER.
Referenced by hlx_group_bufferize_task().
{
ALIGN(ALIGN_DOUBLE_POINTER) struct queue_element
*qe[QUEUE_PAC_SIZE];
/* TRD : user_data can be 0 */
queue_internal_guaranteed_new_element_from_freelist( qs, qe, user_data );
if( qe[QUEUE_POINTER] == 0 )
return( 0 );
queue_internal_queue( qs, qe );
return( 1 );
}
| int queue_new | ( | struct queue_state ** | sq, |
| atom_t | number_elements | ||
| ) |
Definition at line 9 of file queue_new.c.
References ALIGN_DOUBLE_POINTER, hlx_api::aligned_free_entry, hlx_api::aligned_malloc_entry, freelist_new(), queue_internal_freelist_init_function(), queue_internal_new_element_from_freelist(), QUEUE_PAC_SIZE, and QUEUE_POINTER.
Referenced by hlx_group_construct().
{
int
rv = 0;
struct queue_element
*qe[QUEUE_PAC_SIZE];
/* TRD : number_elements can be any value in its range */
*qs = (struct queue_state *) gl_api.aligned_malloc_entry( sizeof(struct queue_state), ALIGN_DOUBLE_POINTER );
if( *qs != 0 )
{
/* TRD : the size of the freelist is the size of the queue (+1 for the leading dummy element, which is hidden from the caller) */
freelist_new( &(*qs)->fs, number_elements+1, queue_internal_freelist_init_function, 0 );
if( (*qs)->fs != 0 )
{
queue_internal_new_element_from_freelist( *qs, qe, 0 );
(*qs)->enqueue[QUEUE_POINTER] = (*qs)->dequeue[QUEUE_POINTER] = qe[QUEUE_POINTER];
(*qs)->aba_counter = 0;
rv = 1;
}
if( (*qs)->fs == 0 )
{
gl_api.aligned_free_entry( *qs );
*qs = 0;
}
}
return( rv );
}
| void queue_query | ( | struct queue_state * | qs, |
| enum queue_query_type | query_type, | ||
| void * | query_input, | ||
| void * | query_output | ||
| ) |
Definition at line 10 of file queue_query.c.
References freelist_query(), FREELIST_QUERY_ELEMENT_COUNT, queue_state::fs, queue_internal_validate(), QUEUE_QUERY_ELEMENT_COUNT, and QUEUE_QUERY_VALIDATE.
Referenced by hlx_group_get_size().
{
/* TRD : query_type can be any value in its range */
/* TRD : query_input can be 0 */
switch( query_type )
{
case QUEUE_QUERY_ELEMENT_COUNT:
freelist_query( qs->fs, FREELIST_QUERY_ELEMENT_COUNT, 0, query_output );
break;
case QUEUE_QUERY_VALIDATE:
/* TRD : query_input can be 0 */
queue_internal_validate( qs, (struct validation_info *) query_input, (enum data_structure_validity *) query_output, ((enum data_structure_validity *) query_output)+1 );
break;
}
return;
}
| void slist_delete | ( | struct slist_state * | ss | ) |
Definition at line 6 of file slist_delete.c.
References hlx_api::aligned_free_entry, and slist_delete_all_elements().
Referenced by _destroy_channel_manager(), and hlx_event_manager_destroy().
{
slist_delete_all_elements( ss );
gl_api.aligned_free_entry( ss );
return;
}
| void slist_delete_all_elements | ( | struct slist_state * | ss | ) |
Definition at line 15 of file slist_delete.c.
References hlx_api::aligned_free_entry, slist_state::head, slist_element::next, slist_internal_init_slist(), SLIST_USER_DATA, slist_element::user_data_and_flags, slist_state::user_data_delete_function, and slist_state::user_state.
Referenced by _hlx_event_handler_destroy(), and slist_delete().
{
struct slist_element *volatile se, *volatile se_temp;
se = ss->head;
while( se != 0 )
{
/* TRD : if a non-deleted element and there is a delete function, call the delete function */
if( ss->user_data_delete_function != 0 )
ss->user_data_delete_function( (void *) se->user_data_and_flags[SLIST_USER_DATA], ss->user_state );
se_temp = se;
se = se->next;
gl_api.aligned_free_entry( (void *) se_temp );
}
slist_internal_init_slist( ss, ss->user_data_delete_function, ss->user_state );
return;
}
| void slist_delete_element | ( | struct slist_state * | ss, |
| struct slist_element * | se | ||
| ) |
| struct slist_element* slist_get_head | ( | struct slist_state * | ss, |
| struct slist_element ** | se | ||
| ) | [read] |
Definition at line 17 of file slist_get_and_set.c.
References slist_state::head, and slist_internal_move_to_first_undeleted_element().
Referenced by slist_get_head_and_then_next().
{
*se = (struct slist_element *) ss->head;
slist_internal_move_to_first_undeleted_element( se );
return( *se );
}
| struct slist_element* slist_get_head_and_then_next | ( | struct slist_state * | ss, |
| struct slist_element ** | se | ||
| ) | [read] |
Definition at line 35 of file slist_get_and_set.c.
References slist_get_head(), and slist_get_next().
Referenced by _destroy_channel_manager(), _hlx_event_return_handler_by_hash(), _hlx_get_channel_by_hash(), hlx_event_manager_destroy(), and hlx_event_notify().
{
if( *se == 0 )
slist_get_head( ss, se );
else
slist_get_next( *se, se );
return( *se );
}
| struct slist_element* slist_get_next | ( | struct slist_element * | se, |
| struct slist_element ** | next_se | ||
| ) | [read] |
Definition at line 26 of file slist_get_and_set.c.
References slist_element::next, and slist_internal_move_to_first_undeleted_element().
Referenced by slist_get_head_and_then_next().
{
*next_se = (struct slist_element *) se->next;
slist_internal_move_to_first_undeleted_element( next_se );
return( *next_se );
}
| int slist_get_user_data_from_element | ( | struct slist_element * | se, |
| void ** | user_data | ||
| ) |
Definition at line 4 of file slist_get_and_set.c.
References SLIST_FLAG_DELETED, SLIST_FLAGS, SLIST_USER_DATA, and slist_element::user_data_and_flags.
Referenced by _destroy_channel_manager(), _hlx_event_return_handler_by_hash(), _hlx_get_channel_by_hash(), hlx_event_manager_destroy(), and hlx_event_notify().
{
int
rv = 1;
*user_data = (void *) se->user_data_and_flags[SLIST_USER_DATA];
if( (atom_t) se->user_data_and_flags[SLIST_FLAGS] & SLIST_FLAG_DELETED )
rv = 0;
return( rv );
}
| int slist_new | ( | struct slist_state ** | ss, |
| void(*)(void *user_data, void *user_state) | user_data_delete_function, | ||
| void * | user_state | ||
| ) |
Definition at line 6 of file slist_new.c.
References ALIGN_SINGLE_POINTER, hlx_api::aligned_malloc_entry, slist_internal_init_slist(), and slist_state::user_data_delete_function.
Referenced by _hlx_event_handler_create_by_hash(), _init_channel_manager(), hlx_chan_create(), and hlx_event_manager_create().
{
int
rv = 0;
/* TRD : user_data_delete_function can be 0 */
/* TRD : user_state can be 0 */
*ss = (struct slist_state *) gl_api.aligned_malloc_entry( sizeof(struct slist_state), ALIGN_SINGLE_POINTER );
if( *ss != 0 )
{
slist_internal_init_slist( *ss, user_data_delete_function, user_state );
rv = 1;
}
return( rv );
}
| struct slist_element* slist_new_head | ( | struct slist_state * | ss, |
| void * | user_data | ||
| ) | [read] |
Definition at line 37 of file slist_new.c.
References ALIGN, ALIGN_DOUBLE_POINTER, ALIGN_SINGLE_POINTER, hlx_api::aligned_malloc_entry, SLIST_FLAGS, slist_internal_link_element_to_head(), SLIST_NO_FLAGS, SLIST_USER_DATA, and slist_element::user_data_and_flags.
Referenced by _hlx_event_handler_create_by_hash(), _hlx_event_register_callback_with_group(), and hlx_chan_create().
{
ALIGN(ALIGN_SINGLE_POINTER) struct slist_element
*volatile se;
/* TRD : user_data can be 0 */
se = (struct slist_element *) gl_api.aligned_malloc_entry( sizeof(struct slist_element), ALIGN_DOUBLE_POINTER );
if( se != 0 )
{
se->user_data_and_flags[SLIST_USER_DATA] = user_data;
se->user_data_and_flags[SLIST_FLAGS] = SLIST_NO_FLAGS;
slist_internal_link_element_to_head( ss, se );
}
return( (struct slist_element *) se );
}
| struct slist_element* slist_new_next | ( | struct slist_element * | se, |
| void * | user_data | ||
| ) | [read] |
| int slist_set_user_data_in_element | ( | struct slist_element * | se, |
| void * | user_data | ||
| ) |
1.7.4