]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/src/lfds710_ringbuffer/lfds710_ringbuffer_query.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / src / lfds710_ringbuffer / lfds710_ringbuffer_query.c
1 /***** includes *****/
2 #include "lfds710_ringbuffer_internal.h"
3
4 /***** private prototypes *****/
5 static void lfds710_ringbuffer_internal_validate( struct lfds710_ringbuffer_state *rs,
6                                                   struct lfds710_misc_validation_info *vi,
7                                                   enum lfds710_misc_validity *lfds710_queue_umm_validity,
8                                                   enum lfds710_misc_validity *lfds710_freelist_validity );
9
10
11
12 /****************************************************************************/
13 void lfds710_ringbuffer_query( struct lfds710_ringbuffer_state *rs,
14                                enum lfds710_ringbuffer_query query_type,
15                                void *query_input,
16                                void *query_output )
17 {
18   LFDS710_PAL_ASSERT( rs != NULL );
19   // TRD : query_type can be any value in its range
20
21   LFDS710_MISC_BARRIER_LOAD;
22
23   switch( query_type )
24   {
25     case LFDS710_RINGBUFFER_QUERY_SINGLETHREADED_GET_COUNT:
26       LFDS710_PAL_ASSERT( query_input == NULL );
27       LFDS710_PAL_ASSERT( query_output != NULL );
28
29       lfds710_queue_umm_query( &rs->qumms, LFDS710_QUEUE_UMM_QUERY_SINGLETHREADED_GET_COUNT, NULL, query_output );
30     break;
31
32     case LFDS710_RINGBUFFER_QUERY_SINGLETHREADED_VALIDATE:
33       // TRD : query_input can be NULL
34       LFDS710_PAL_ASSERT( query_output != NULL );
35
36       lfds710_ringbuffer_internal_validate( rs, (struct lfds710_misc_validation_info *) query_input, (enum lfds710_misc_validity *) query_output, ((enum lfds710_misc_validity *) query_output)+1 );
37     break;
38   }
39
40   return;
41 }
42
43
44
45
46
47 /****************************************************************************/
48 static void lfds710_ringbuffer_internal_validate( struct lfds710_ringbuffer_state *rs,
49                                                   struct lfds710_misc_validation_info *vi,
50                                                   enum lfds710_misc_validity *lfds710_queue_umm_validity,
51                                                   enum lfds710_misc_validity *lfds710_freelist_validity )
52 {
53   LFDS710_PAL_ASSERT( rs != NULL );
54   // TRD : vi can be NULL
55   LFDS710_PAL_ASSERT( lfds710_queue_umm_validity != NULL );
56   LFDS710_PAL_ASSERT( lfds710_freelist_validity != NULL );
57
58   if( vi == NULL )
59   {
60     lfds710_queue_umm_query( &rs->qumms, LFDS710_QUEUE_UMM_QUERY_SINGLETHREADED_VALIDATE, NULL, lfds710_queue_umm_validity );
61     lfds710_freelist_query( &rs->fs, LFDS710_FREELIST_QUERY_SINGLETHREADED_VALIDATE, NULL, lfds710_freelist_validity );
62   }
63
64   if( vi != NULL )
65   {
66     struct lfds710_misc_validation_info
67       freelist_vi,
68       queue_vi;
69
70     queue_vi.min_elements = 0;
71     freelist_vi.min_elements = 0;
72     queue_vi.max_elements = vi->max_elements;
73     freelist_vi.max_elements = vi->max_elements;
74
75     lfds710_queue_umm_query( &rs->qumms, LFDS710_QUEUE_UMM_QUERY_SINGLETHREADED_VALIDATE, &queue_vi, lfds710_queue_umm_validity );
76     lfds710_freelist_query( &rs->fs, LFDS710_FREELIST_QUERY_SINGLETHREADED_VALIDATE, &freelist_vi, lfds710_freelist_validity );
77   }
78
79   return;
80 }
81