]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.0.0/liblfds700/src/lfds700_ringbuffer/lfds700_ringbuffer_query.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.0.0 / liblfds700 / src / lfds700_ringbuffer / lfds700_ringbuffer_query.c
1 /***** includes *****/
2 #include "lfds700_ringbuffer_internal.h"
3
4 /***** private prototypes *****/
5 static void lfds700_ringbuffer_internal_validate( struct lfds700_ringbuffer_state *rs, struct lfds700_misc_validation_info *vi, enum lfds700_misc_validity *lfds700_queue_validity, enum lfds700_misc_validity *lfds700_freelist_validity );
6
7
8
9 /****************************************************************************/
10 void lfds700_ringbuffer_query( struct lfds700_ringbuffer_state *rs, enum lfds700_ringbuffer_query query_type, void *query_input, void *query_output )
11 {
12   LFDS700_PAL_ASSERT( rs != NULL );
13   // TRD : query_type can be any value in its range
14
15   LFDS700_MISC_BARRIER_LOAD;
16
17   switch( query_type )
18   {
19     case LFDS700_RINGBUFFER_QUERY_SINGLETHREADED_GET_COUNT:
20       LFDS700_PAL_ASSERT( query_input == NULL );
21       LFDS700_PAL_ASSERT( query_output != NULL );
22
23       lfds700_queue_query( &rs->qs, LFDS700_QUEUE_QUERY_SINGLETHREADED_GET_COUNT, NULL, query_output );
24     break;
25
26     case LFDS700_RINGBUFFER_QUERY_SINGLETHREADED_VALIDATE:
27       // TRD : query_input can be NULL
28       LFDS700_PAL_ASSERT( query_output != NULL );
29
30       lfds700_ringbuffer_internal_validate( rs, (struct lfds700_misc_validation_info *) query_input, (enum lfds700_misc_validity *) query_output, ((enum lfds700_misc_validity *) query_output)+1 );
31     break;
32   }
33
34   return;
35 }
36
37
38
39
40
41 /****************************************************************************/
42 static void lfds700_ringbuffer_internal_validate( struct lfds700_ringbuffer_state *rs, struct lfds700_misc_validation_info *vi, enum lfds700_misc_validity *lfds700_queue_validity, enum lfds700_misc_validity *lfds700_freelist_validity )
43 {
44   LFDS700_PAL_ASSERT( rs != NULL );
45   // TRD : vi can be NULL
46   LFDS700_PAL_ASSERT( lfds700_queue_validity != NULL );
47   LFDS700_PAL_ASSERT( lfds700_freelist_validity != NULL );
48
49   if( vi == NULL )
50   {
51     lfds700_queue_query( &rs->qs, LFDS700_QUEUE_QUERY_SINGLETHREADED_VALIDATE, NULL, lfds700_queue_validity );
52     lfds700_freelist_query( &rs->fs, LFDS700_FREELIST_QUERY_SINGLETHREADED_VALIDATE, NULL, lfds700_freelist_validity );
53   }
54
55   if( vi != NULL )
56   {
57     struct lfds700_misc_validation_info
58       freelist_vi,
59       queue_vi;
60
61     queue_vi.min_elements = 0;
62     freelist_vi.min_elements = 0;
63     queue_vi.max_elements = vi->max_elements;
64     freelist_vi.max_elements = vi->max_elements;
65
66     lfds700_queue_query( &rs->qs, LFDS700_QUEUE_QUERY_SINGLETHREADED_VALIDATE, &queue_vi, lfds700_queue_validity );
67     lfds700_freelist_query( &rs->fs, LFDS700_FREELIST_QUERY_SINGLETHREADED_VALIDATE, &freelist_vi, lfds700_freelist_validity );
68   }
69
70   return;
71 }
72