![]() |
Helixis 1.0
Task Programming API
|
#include "queue_internal.h"Go to the source code of this file.
Functions | |
| int | queue_new (struct queue_state **qs, atom_t number_elements) |
| int | queue_internal_freelist_init_function (void **user_data, void *user_state) |
| void | queue_internal_new_element_from_freelist (struct queue_state *qs, struct queue_element *qe[2], void *user_data) |
| void | queue_internal_guaranteed_new_element_from_freelist (struct queue_state *qs, struct queue_element *qe[2], void *user_data) |
| void | queue_internal_init_element (struct queue_state *qs, struct queue_element *qe[2], struct freelist_element *fe, void *user_data) |
Variables | |
| hlx_api | gl_api |
| int queue_internal_freelist_init_function | ( | void ** | user_data, |
| void * | user_state | ||
| ) |
Definition at line 51 of file queue_new.c.
References ALIGN_DOUBLE_POINTER, and hlx_api::aligned_malloc_entry.
Referenced by queue_new().
{
int
rv = 0;
*user_data = gl_api.aligned_malloc_entry( sizeof(struct queue_element), ALIGN_DOUBLE_POINTER );
if( *user_data != 0 )
rv = 1;
return( rv );
}
| void queue_internal_guaranteed_new_element_from_freelist | ( | struct queue_state * | qs, |
| struct queue_element * | qe[2], | ||
| void * | user_data | ||
| ) |
Definition at line 93 of file queue_new.c.
References freelist_guaranteed_pop(), queue_state::fs, queue_internal_init_element(), and QUEUE_POINTER.
Referenced by queue_guaranteed_enqueue().
{
struct freelist_element
*fe;
/* TRD : user_data can be any value in its range */
qe[QUEUE_POINTER] = 0;
freelist_guaranteed_pop( qs->fs, &fe );
if( fe != 0 )
queue_internal_init_element( qs, qe, fe, user_data );
return;
}
| void queue_internal_init_element | ( | struct queue_state * | qs, |
| struct queue_element * | qe[2], | ||
| struct freelist_element * | fe, | ||
| void * | user_data | ||
| ) |
Definition at line 115 of file queue_new.c.
References queue_state::aba_counter, hlx_api::atomic_incr_entry, queue_element::fe, freelist_get_user_data_from_element(), QUEUE_COUNTER, QUEUE_POINTER, and queue_element::user_data.
Referenced by queue_internal_guaranteed_new_element_from_freelist(), and queue_internal_new_element_from_freelist().
{
/* TRD : user_data can be any value in its range */
freelist_get_user_data_from_element( fe, (void **) &qe[QUEUE_POINTER] );
qe[QUEUE_COUNTER] = (struct queue_element *) gl_api.atomic_incr_entry( (atom_t *) &qs->aba_counter );
qe[QUEUE_POINTER]->next[QUEUE_POINTER] = 0;
qe[QUEUE_POINTER]->next[QUEUE_COUNTER] = (struct queue_element *) gl_api.atomic_incr_entry( (atom_t *) &qs->aba_counter );
qe[QUEUE_POINTER]->fe = fe;
qe[QUEUE_POINTER]->user_data = user_data;
return;
}
| void queue_internal_new_element_from_freelist | ( | struct queue_state * | qs, |
| struct queue_element * | qe[2], | ||
| void * | user_data | ||
| ) |
Definition at line 71 of file queue_new.c.
References freelist_pop(), queue_state::fs, queue_internal_init_element(), and QUEUE_POINTER.
Referenced by queue_enqueue(), and queue_new().
{
struct freelist_element
*fe;
/* TRD : user_data can be any value in its range */
qe[QUEUE_POINTER] = 0;
freelist_pop( qs->fs, &fe );
if( fe != 0 )
queue_internal_init_element( qs, qe, fe, user_data );
return;
}
| int queue_new | ( | struct queue_state ** | qs, |
| 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 );
}
1.7.4