]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.0.0/liblfds700/src/lfds700_queue_bounded_singleconsumer_singleproducer/lfds700_queue_bounded_singleconsumer_singleproducer_query.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.0.0 / liblfds700 / src / lfds700_queue_bounded_singleconsumer_singleproducer / lfds700_queue_bounded_singleconsumer_singleproducer_query.c
1 /***** includes *****/
2 #include "lfds700_queue_bounded_singleconsumer_singleproducer_internal.h"
3
4 /***** private prototypes *****/
5 static void lfds700_queue_bss_internal_validate( struct lfds700_queue_bss_state *qbsss, struct lfds700_misc_validation_info *vi, enum lfds700_misc_validity *lfds700_validity );
6
7
8
9
10
11 /****************************************************************************/
12 void lfds700_queue_bss_query( struct lfds700_queue_bss_state *qbsss, enum lfds700_queue_bss_query query_type, void *query_input, void *query_output )
13 {
14   LFDS700_PAL_ASSERT( qbsss != NULL );
15   // TRD : query_type can be any value in its range
16
17   switch( query_type )
18   {
19     case LFDS700_QUEUE_BSS_QUERY_GET_POTENTIALLY_INACCURATE_COUNT:
20       LFDS700_PAL_ASSERT( query_input == NULL );
21       LFDS700_PAL_ASSERT( query_output != NULL );
22
23       LFDS700_MISC_BARRIER_LOAD;
24
25       *(lfds700_pal_uint_t *) query_output = +( qbsss->write_index - qbsss->read_index );
26       if( qbsss->read_index > qbsss->write_index )
27         *(lfds700_pal_uint_t *) query_output = qbsss->number_elements - *(lfds700_pal_uint_t *) query_output;
28     break;
29
30     case LFDS700_QUEUE_BSS_QUERY_VALIDATE:
31       // TRD : query_input can be NULL
32       LFDS700_PAL_ASSERT( query_output != NULL );
33
34       lfds700_queue_bss_internal_validate( qbsss, (struct lfds700_misc_validation_info *) query_input, (enum lfds700_misc_validity *) query_output );
35     break;
36   }
37
38   return;
39 }
40
41
42
43
44
45 /****************************************************************************/
46 static void lfds700_queue_bss_internal_validate( struct lfds700_queue_bss_state *qbsss, struct lfds700_misc_validation_info *vi, enum lfds700_misc_validity *lfds700_validity )
47 {
48   LFDS700_PAL_ASSERT( qbsss != NULL );
49   // TRD : vi can be NULL
50   LFDS700_PAL_ASSERT( lfds700_validity != NULL );
51
52   *lfds700_validity = LFDS700_MISC_VALIDITY_VALID;
53
54   if( vi != NULL )
55   {
56     lfds700_pal_uint_t
57       number_elements;
58
59     lfds700_queue_bss_query( qbsss, LFDS700_QUEUE_BSS_QUERY_GET_POTENTIALLY_INACCURATE_COUNT, NULL, (void *) &number_elements );
60
61     if( number_elements < vi->min_elements )
62       *lfds700_validity = LFDS700_MISC_VALIDITY_INVALID_MISSING_ELEMENTS;
63
64     if( number_elements > vi->max_elements )
65       *lfds700_validity = LFDS700_MISC_VALIDITY_INVALID_ADDITIONAL_ELEMENTS;
66   }
67
68   return;
69 }
70