]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.0/liblfds610/src/lfds610_ringbuffer/lfds610_ringbuffer_new.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.0 / liblfds610 / src / lfds610_ringbuffer / lfds610_ringbuffer_new.c
1 #include "lfds610_ringbuffer_internal.h"
2
3
4
5
6
7 /****************************************************************************/
8 int lfds610_ringbuffer_new( struct lfds610_ringbuffer_state **rs, lfds610_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state )
9 {
10   int
11     rv = 0;
12
13   assert( rs != NULL );
14   // TRD : number_elements can be any value in its range
15   // TRD : user_data_init_function can be NULL
16   // TRD : user_state can be NULL
17
18   *rs = (struct lfds610_ringbuffer_state *) lfds610_liblfds_aligned_malloc( sizeof(struct lfds610_ringbuffer_state), LFDS610_ALIGN_DOUBLE_POINTER );
19
20   if( *rs != NULL )
21   {
22     lfds610_freelist_new( &(*rs)->fs, number_elements, user_data_init_function, user_state );
23
24     if( (*rs)->fs != NULL )
25     {
26       lfds610_queue_new( &(*rs)->qs, number_elements );
27
28       if( (*rs)->qs != NULL )
29         rv = 1;
30
31       if( (*rs)->qs == NULL )
32       {
33         lfds610_liblfds_aligned_free( *rs );
34         *rs = NULL;
35       }
36     }
37
38     if( (*rs)->fs == NULL )
39     {
40       lfds610_liblfds_aligned_free( *rs );
41       *rs = NULL;
42     }
43   }
44
45   LFDS610_BARRIER_STORE;
46
47   return( rv );
48 }
49
50
51
52
53
54 /****************************************************************************/
55 #pragma warning( disable : 4100 )
56
57 void lfds610_ringbuffer_use( struct lfds610_ringbuffer_state *rs )
58 {
59   assert( rs != NULL );
60
61   LFDS610_BARRIER_LOAD;
62
63   return;
64 }
65
66 #pragma warning( default : 4100 )
67