Helixis 1.0
Task Programming API
Functions | Variables
sources/liblfds/queue/queue_new.c File Reference
#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

Function Documentation

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 
)
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 );
}

Variable Documentation

Definition at line 42 of file api.c.

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines