![]() |
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 ); }