]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/test_and_benchmark/libbenchmark/src/libbenchmark_datastructures_queue_umm/libbenchmark_datastructure_queue_umm_windows_mutex.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / test_and_benchmark / libbenchmark / src / libbenchmark_datastructures_queue_umm / libbenchmark_datastructure_queue_umm_windows_mutex.c
1 /***** includes *****/
2 #include "libbenchmark_datastructure_queue_umm_internal.h"
3
4
5
6
7
8 /****************************************************************************/
9 void libbenchmark_datastructure_queue_umm_windows_mutex_init( struct libbenchmark_datastructure_queue_umm_windows_mutex_state *qs, struct libbenchmark_datastructure_queue_umm_windows_mutex_element *qe, void *user_state )
10 {
11   LFDS710_PAL_ASSERT( qs != NULL );
12   LFDS710_PAL_ASSERT( qe != NULL );
13   LFDS710_PAL_ASSERT( user_state == NULL );
14
15   qe->next = NULL;
16
17   qs->enqueue_umm = qe;
18   qs->dequeue_umm = qe;
19
20   LIBBENCHMARK_PAL_LOCK_WINDOWS_MUTEX_CREATE( qs->lock_enqueue_umm );
21   LIBBENCHMARK_PAL_LOCK_WINDOWS_MUTEX_CREATE( qs->lock_dequeue_umm );
22
23   qs->user_state = user_state;
24
25   LFDS710_MISC_BARRIER_STORE;
26
27   lfds710_misc_force_store();
28
29   return;
30 }
31
32
33
34
35
36 /****************************************************************************/
37 void libbenchmark_datastructure_queue_umm_windows_mutex_cleanup( struct libbenchmark_datastructure_queue_umm_windows_mutex_state *qs,
38                                                 void (*element_cleanup_callback)(struct libbenchmark_datastructure_queue_umm_windows_mutex_state *qs, struct libbenchmark_datastructure_queue_umm_windows_mutex_element *qe, enum flag dummy_element_flag) )
39 {
40   struct libbenchmark_datastructure_queue_umm_windows_mutex_element
41     *qe;
42
43   LFDS710_PAL_ASSERT( qs != NULL );
44   // TRD : element_cleanup_callback can be NULL
45
46   LFDS710_MISC_BARRIER_LOAD;
47
48   if( element_cleanup_callback != NULL )
49     while( libbenchmark_datastructure_queue_umm_windows_mutex_dequeue_umm(qs, &qe) )
50       element_cleanup_callback( qs, qe, LOWERED );
51
52   LIBBENCHMARK_PAL_LOCK_WINDOWS_MUTEX_DESTROY( qs->lock_enqueue_umm );
53   LIBBENCHMARK_PAL_LOCK_WINDOWS_MUTEX_DESTROY( qs->lock_dequeue_umm );
54
55   return;
56 }
57
58
59
60
61
62 /****************************************************************************/
63 void libbenchmark_datastructure_queue_umm_windows_mutex_enqueue_umm( struct libbenchmark_datastructure_queue_umm_windows_mutex_state *qs, struct libbenchmark_datastructure_queue_umm_windows_mutex_element *qe )
64 {
65   LFDS710_PAL_ASSERT( qs != NULL );
66   LFDS710_PAL_ASSERT( qe != NULL );
67
68   qe->next = NULL;
69
70   LIBBENCHMARK_PAL_LOCK_WINDOWS_MUTEX_GET( qs->lock_enqueue_umm );
71
72   qs->enqueue_umm->next = qe;
73   qs->enqueue_umm = qe;
74
75   LIBBENCHMARK_PAL_LOCK_WINDOWS_MUTEX_RELEASE( qs->lock_enqueue_umm );
76
77   return;
78 }
79
80
81
82
83
84 /****************************************************************************/
85 int libbenchmark_datastructure_queue_umm_windows_mutex_dequeue_umm( struct libbenchmark_datastructure_queue_umm_windows_mutex_state *qs, struct libbenchmark_datastructure_queue_umm_windows_mutex_element **qe )
86 {
87   int
88     rv = 1;
89
90   LFDS710_PAL_ASSERT( qs != NULL );
91   LFDS710_PAL_ASSERT( qe != NULL );
92
93   LIBBENCHMARK_PAL_LOCK_WINDOWS_MUTEX_GET( qs->lock_dequeue_umm );
94
95   if( qs->dequeue_umm == qs->enqueue_umm )
96   {
97     *qe = NULL;
98     rv = 0;
99   }
100   else
101   {
102     *qe = qs->dequeue_umm;
103     (*qe)->key = qs->dequeue_umm->next->key;
104     (*qe)->key = qs->dequeue_umm->next->value;
105     qs->dequeue_umm = qs->dequeue_umm->next;
106   }
107
108   LIBBENCHMARK_PAL_LOCK_WINDOWS_MUTEX_RELEASE( qs->lock_dequeue_umm );
109
110   return rv;
111 }
112