]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.0.0/liblfds700/src/lfds700_ringbuffer/lfds700_ringbuffer_cleanup.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.0.0 / liblfds700 / src / lfds700_ringbuffer / lfds700_ringbuffer_cleanup.c
1 /***** includes *****/
2 #include "lfds700_ringbuffer_internal.h"
3
4 /***** private prototypes *****/
5 static void lfds700_ringbuffer_internal_queue_element_cleanup_callback( struct lfds700_queue_state *qs, struct lfds700_queue_element *qe, enum lfds700_misc_flag dummy_element_flag );
6 static void lfds700_ringbuffer_internal_freelist_element_cleanup_callback( struct lfds700_freelist_state *fs, struct lfds700_freelist_element *fe );
7
8
9
10
11
12 /****************************************************************************/
13 void lfds700_ringbuffer_cleanup( struct lfds700_ringbuffer_state *rs,
14                                  void (*element_cleanup_callback)(struct lfds700_ringbuffer_state *rs, void *key, void *value, enum lfds700_misc_flag unread_flag) )
15 {
16   LFDS700_PAL_ASSERT( rs != NULL );
17   // TRD : element_cleanup_callback can be NULL
18
19   if( element_cleanup_callback != NULL )
20   {
21     rs->element_cleanup_callback = element_cleanup_callback;
22     lfds700_queue_cleanup( &rs->qs, lfds700_ringbuffer_internal_queue_element_cleanup_callback );
23     lfds700_freelist_cleanup( &rs->fs, lfds700_ringbuffer_internal_freelist_element_cleanup_callback );
24   }
25
26   return;
27 }
28
29
30
31
32
33 /****************************************************************************/
34 #pragma warning( disable : 4100 )
35
36 static void lfds700_ringbuffer_internal_queue_element_cleanup_callback( struct lfds700_queue_state *qs, struct lfds700_queue_element *qe, enum lfds700_misc_flag dummy_element_flag )
37 {
38   struct lfds700_ringbuffer_element
39     *re;
40
41   struct lfds700_ringbuffer_state
42     *rs;
43
44   LFDS700_PAL_ASSERT( qs != NULL );
45   LFDS700_PAL_ASSERT( qe != NULL );
46   // TRD : dummy_element can be any value in its range
47
48   rs = (struct lfds700_ringbuffer_state *) LFDS700_QUEUE_GET_USER_STATE_FROM_STATE( *qs );
49   re = (struct lfds700_ringbuffer_element *) LFDS700_QUEUE_GET_VALUE_FROM_ELEMENT( *qe );
50
51   if( dummy_element_flag == LFDS700_MISC_FLAG_LOWERED )
52     rs->element_cleanup_callback( rs, re->key, re->value, LFDS700_MISC_FLAG_RAISED );
53
54   return;
55 }
56
57 #pragma warning( default : 4100 )
58
59
60
61
62
63 /****************************************************************************/
64 #pragma warning( disable : 4100 )
65
66 static void lfds700_ringbuffer_internal_freelist_element_cleanup_callback( struct lfds700_freelist_state *fs, struct lfds700_freelist_element *fe )
67 {
68   struct lfds700_ringbuffer_element
69     *re;
70
71   struct lfds700_ringbuffer_state
72     *rs;
73
74   LFDS700_PAL_ASSERT( fs != NULL );
75   LFDS700_PAL_ASSERT( fe != NULL );
76
77   rs = (struct lfds700_ringbuffer_state *) LFDS700_FREELIST_GET_USER_STATE_FROM_STATE( *fs );
78   re = (struct lfds700_ringbuffer_element *) LFDS700_FREELIST_GET_VALUE_FROM_ELEMENT( *fe );
79
80   rs->element_cleanup_callback( rs, re->key, re->value, LFDS700_MISC_FLAG_LOWERED );
81
82   return;
83 }
84
85 #pragma warning( default : 4100 )
86