Helixis 1.0
Task Programming API
sources/liblfds/queue/queue_internal.h
Go to the documentation of this file.
00001 /***** the library wide include file *****/
00002 #include "liblfds/liblfds_internal.h"
00003 
00004 #if defined(HLX_BUILD_WITH_PARALLEL_THREADING)
00005 
00006 /***** pragmas *****/
00007 
00008 /***** defines *****/
00009 #define QUEUE_STATE_UNKNOWN               -1
00010 #define QUEUE_STATE_EMPTY                  0
00011 #define QUEUE_STATE_ENQUEUE_OUT_OF_PLACE   1
00012 #define QUEUE_STATE_ATTEMPT_DEQUEUE        2
00013 
00014 #define QUEUE_POINTER 0
00015 #define QUEUE_COUNTER 1
00016 #define QUEUE_PAC_SIZE 2
00017 
00018 /***** structures *****/
00019 #pragma pack( push, ALIGN_DOUBLE_POINTER )
00020 
00021 struct queue_state
00022 {
00023   struct queue_element
00024     *volatile enqueue[QUEUE_PAC_SIZE],
00025     *volatile dequeue[QUEUE_PAC_SIZE];
00026 
00027   atom_t
00028     aba_counter;
00029 
00030   struct freelist_state
00031     *fs;
00032 };
00033 
00034 struct queue_element
00035 {
00036   /* TRD : next in a queue requires volatile as it is target of CAS */
00037   struct queue_element
00038     *volatile next[QUEUE_PAC_SIZE];
00039 
00040   struct freelist_element
00041     *fe;
00042 
00043   void
00044     *user_data;
00045 };
00046 
00047 #pragma pack( pop )
00048 
00049 /***** externs *****/
00050 
00051 /***** private prototypes *****/
00052 int queue_internal_freelist_init_function( void **user_data, void *user_state );
00053 void queue_internal_freelist_delete_function( void *user_data, void *user_state );
00054 
00055 void queue_internal_new_element_from_freelist( struct queue_state *qs, struct queue_element *qe[QUEUE_PAC_SIZE], void *user_data );
00056 void queue_internal_guaranteed_new_element_from_freelist( struct queue_state *qs, struct queue_element * qe[QUEUE_PAC_SIZE], void *user_data );
00057 void queue_internal_init_element( struct queue_state *qs, struct queue_element *qe[QUEUE_PAC_SIZE], struct freelist_element *fe, void *user_data );
00058 
00059 void queue_internal_queue( struct queue_state *qs, struct queue_element *qe[QUEUE_PAC_SIZE] );
00060 
00061 void queue_internal_validate( struct queue_state *qs, struct validation_info *vi, enum data_structure_validity *queue_validity, enum data_structure_validity *freelist_validity );
00062 
00063 #endif
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines