]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/src/lfds710_queue_bounded_singleproducer_singleconsumer/lfds710_queue_bounded_singleproducer_singleconsumer_query.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / src / lfds710_queue_bounded_singleproducer_singleconsumer / lfds710_queue_bounded_singleproducer_singleconsumer_query.c
1 /***** includes *****/
2 #include "lfds710_queue_bounded_singleproducer_singleconsumer_internal.h"
3
4 /***** private prototypes *****/
5 static void lfds710_queue_bss_internal_validate( struct lfds710_queue_bss_state *qbsss,
6                                                  struct lfds710_misc_validation_info *vi,
7                                                  enum lfds710_misc_validity *lfds710_validity );
8
9
10
11
12
13 /****************************************************************************/
14 void lfds710_queue_bss_query( struct lfds710_queue_bss_state *qbsss,
15                               enum lfds710_queue_bss_query query_type,
16                               void *query_input,
17                               void *query_output )
18 {
19   LFDS710_PAL_ASSERT( qbsss != NULL );
20   // TRD : query_type can be any value in its range
21
22   switch( query_type )
23   {
24     case LFDS710_QUEUE_BSS_QUERY_GET_POTENTIALLY_INACCURATE_COUNT:
25     {
26       lfds710_pal_uint_t
27         local_read_index,
28         local_write_index;
29
30       LFDS710_PAL_ASSERT( query_input == NULL );
31       LFDS710_PAL_ASSERT( query_output != NULL );
32
33       LFDS710_MISC_BARRIER_LOAD;
34
35       local_read_index = qbsss->read_index;
36       local_write_index = qbsss->write_index;
37
38       *(lfds710_pal_uint_t *) query_output = +( local_write_index - local_read_index );
39
40       if( local_read_index > local_write_index )
41         *(lfds710_pal_uint_t *) query_output = qbsss->number_elements - *(lfds710_pal_uint_t *) query_output;
42     }
43     break;
44
45     case LFDS710_QUEUE_BSS_QUERY_VALIDATE:
46       // TRD : query_input can be NULL
47       LFDS710_PAL_ASSERT( query_output != NULL );
48
49       lfds710_queue_bss_internal_validate( qbsss, (struct lfds710_misc_validation_info *) query_input, (enum lfds710_misc_validity *) query_output );
50     break;
51   }
52
53   return;
54 }
55
56
57
58
59
60 /****************************************************************************/
61 static void lfds710_queue_bss_internal_validate( struct lfds710_queue_bss_state *qbsss,
62                                                  struct lfds710_misc_validation_info *vi,
63                                                  enum lfds710_misc_validity *lfds710_validity )
64 {
65   LFDS710_PAL_ASSERT( qbsss != NULL );
66   // TRD : vi can be NULL
67   LFDS710_PAL_ASSERT( lfds710_validity != NULL );
68
69   *lfds710_validity = LFDS710_MISC_VALIDITY_VALID;
70
71   if( vi != NULL )
72   {
73     lfds710_pal_uint_t
74       number_elements;
75
76     lfds710_queue_bss_query( qbsss, LFDS710_QUEUE_BSS_QUERY_GET_POTENTIALLY_INACCURATE_COUNT, NULL, (void *) &number_elements );
77
78     if( number_elements < vi->min_elements )
79       *lfds710_validity = LFDS710_MISC_VALIDITY_INVALID_MISSING_ELEMENTS;
80
81     if( number_elements > vi->max_elements )
82       *lfds710_validity = LFDS710_MISC_VALIDITY_INVALID_ADDITIONAL_ELEMENTS;
83   }
84
85   return;
86 }
87