![]() |
Helixis 1.0
Task Programming API
|
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