function lfds700_freelist_query
Jump to navigation
Jump to search
Source Files
└───liblfds700 ├───inc │ └───liblfds700 │ lfds700_freelist.h └───src └───lfds700_freelist lfds700_freelist_query.c
Enums
enum lfds700_freelist_query { LFDS700_FREELIST_QUERY_SINGLETHREADED_GET_COUNT, LFDS700_FREELIST_QUERY_SINGLETHREADED_VALIDATE };
Opaque Structures
struct lfds700_freelist_state;
Prototype
void lfds700_freelist_query( struct lfds700_freelist_state *ss, enum lfds700_freelist_query query_type, void *query_input, void *query_output );
Parameters
struct lfds700_freelist_state *fs
- A pointer to an initialized struct lfds700_freelist_state.
enum lfds700_freelist_query query_type
- A single value from enum lfds700_freelist_query, which indicates which query to perform.
void *query_input
- A pointer to input data for the query, where the data varies by query;
- LFDS700_FREELIST_QUERY_SINGLETHREADED_GET_COUNT
- query_input is NULL.
- LFDS700_FREELIST_QUERY_SINGLETHREADED_VALIDATE
- query_input can be NULL, or or can be a pointer to a struct lfds700_misc_validation_info, which specifies an expected min/max count, in which case validation also counts the number of elements and check they fall within the specified range.
- LFDS700_FREELIST_QUERY_SINGLETHREADED_GET_COUNT
void *query_output
- A pointer to output store for the query, where the output varies by query;
- LFDS700_FREELIST_QUERY_SINGLETHREADED_GET_COUNT
- Points to a lfds700_pal_uint_t, which is set to the number of elements in the freelist.
- LFDS700_FREELIST_QUERY_SINGLETHREADED_VALIDATE
- Points to an enum lfds700_misc_validity, which is set to indicate the result of the validation operation.
- LFDS700_FREELIST_QUERY_SINGLETHREADED_GET_COUNT
Notes
All SINGLETHREADED queries can only be safely performed if no push or pop operations occur while the operation runs. If push or pop operations do occur during the execution of a SINGLETHREADED query, it is theoretically possible for the query to enter an infinite loop. Do not do this.
Example
#include <stdio.h> #include "liblfds700.h" int main() { eunm lfds700_misc_validity v; int long long unsigned loop; lfds700_pal_uint_t element_count; struct lfds700_freelist_element *fe; struct lfds700_freelist_state fs; struct lfds700_misc_prng_state LFDS700_PAL_ALIGN( LFDS700_PAL_CACHE_LINE_LENGTH_IN_BYTES ) ps; struct lfds700_misc_validation_info vi; lfds700_misc_library_init_valid_on_current_logical_core(); lfds700_misc_prng_init( &ps ); lfds700_freelist_init_valid_on_current_logical_core( &fs, NULL ); fe = malloc( sizeof(struct lfds700_freelist_element) * 10 ); for( loop = 0 ; loop < 10 ; loop++ ) { LFDS700_FREELIST_SET_VALUE_IN_ELEMENT( fe[loop], (void *) loop ); lfds700_freelist_push( &fs, &fe[loop], &ps ); } lfds700_freelist_query( &fs, LFDS700_FREELIST_QUERY_SINGLETHREADED_GET_COUNT, NULL, &element_count ); printf( "element count = %llu\n", (int long long unsigned) element_count ); vi.min_elements = 10; vi.max_elements = 10; lfds700_freelist_query( &fs, LFDS700_FREELIST_QUERY_SINGLETHREADED_VALIDATE, (void *) &vi, (void *) &v ); if( v == LFDS700_MISC_VALIDITY_VALID ) printf( "Well thank goodnefs for that\n" ); if( v != LFDS700_MISC_VALIDITY_VALID ) printf( "Oh bugger\n" ); lfds700_freelist_cleanup( &fs, NULL ); free( fe ); lfds700_misc_library_cleanup(); return( EXIT_SUCCESS ); }