]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.0.1/liblfds601/src/lfds601_ringbuffer/lfds601_ringbuffer_new.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.0.1 / liblfds601 / src / lfds601_ringbuffer / lfds601_ringbuffer_new.c
1 #include "lfds601_ringbuffer_internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \r
7 /****************************************************************************/\r
8 int lfds601_ringbuffer_new( struct lfds601_ringbuffer_state **rs, lfds601_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state )\r
9 {\r
10   int\r
11     rv = 0;\r
12 \r
13   assert( rs != NULL );\r
14   // TRD : number_elements can be any value in its range\r
15   // TRD : user_data_init_function can be NULL\r
16   // TRD : user_state can be NULL\r
17 \r
18   *rs = (struct lfds601_ringbuffer_state *) lfds601_abstraction_aligned_malloc( sizeof(struct lfds601_ringbuffer_state), LFDS601_ALIGN_DOUBLE_POINTER );\r
19 \r
20   if( *rs != NULL )\r
21   {\r
22     lfds601_freelist_new( &(*rs)->fs, number_elements, user_data_init_function, user_state );\r
23 \r
24     if( (*rs)->fs != NULL )\r
25     {\r
26       lfds601_queue_new( &(*rs)->qs, number_elements );\r
27 \r
28       if( (*rs)->qs != NULL )\r
29         rv = 1;\r
30 \r
31       if( (*rs)->qs == NULL )\r
32       {\r
33         lfds601_abstraction_aligned_free( *rs );\r
34         *rs = NULL;\r
35       }\r
36     }\r
37 \r
38     if( (*rs)->fs == NULL )\r
39     {\r
40       lfds601_abstraction_aligned_free( *rs );\r
41       *rs = NULL;\r
42     }\r
43   }\r
44 \r
45   return( rv );\r
46 }\r
47 \r