2 #include "libbenchmark_datastructure_queue_umm_internal.h"
8 /****************************************************************************/
9 void libbenchmark_datastructure_queue_umm_msvc_spinlock_init( struct libbenchmark_datastructure_queue_umm_msvc_spinlock_state *qs, struct libbenchmark_datastructure_queue_umm_msvc_spinlock_element *qe, void *user_state )
11 LFDS710_PAL_ASSERT( qs != NULL );
12 LFDS710_PAL_ASSERT( qe != NULL );
13 LFDS710_PAL_ASSERT( user_state == NULL );
20 LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_CREATE( qs->lock_enqueue_umm );
21 LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_CREATE( qs->lock_dequeue_umm );
23 qs->user_state = user_state;
25 LFDS710_MISC_BARRIER_STORE;
27 lfds710_misc_force_store();
36 /****************************************************************************/
37 void libbenchmark_datastructure_queue_umm_msvc_spinlock_cleanup( struct libbenchmark_datastructure_queue_umm_msvc_spinlock_state *qs,
38 void (*element_cleanup_callback)(struct libbenchmark_datastructure_queue_umm_msvc_spinlock_state *qs, struct libbenchmark_datastructure_queue_umm_msvc_spinlock_element *qe, enum flag dummy_element_flag) )
40 struct libbenchmark_datastructure_queue_umm_msvc_spinlock_element
43 LFDS710_PAL_ASSERT( qs != NULL );
44 // TRD : element_cleanup_callback can be NULL
46 LFDS710_MISC_BARRIER_LOAD;
48 if( element_cleanup_callback != NULL )
49 while( libbenchmark_datastructure_queue_umm_msvc_spinlock_dequeue_umm(qs, &qe) )
50 element_cleanup_callback( qs, qe, LOWERED );
52 LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_DESTROY( qs->lock_enqueue_umm );
53 LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_DESTROY( qs->lock_dequeue_umm );
62 /****************************************************************************/
63 void libbenchmark_datastructure_queue_umm_msvc_spinlock_enqueue_umm( struct libbenchmark_datastructure_queue_umm_msvc_spinlock_state *qs, struct libbenchmark_datastructure_queue_umm_msvc_spinlock_element *qe )
65 LFDS710_PAL_ASSERT( qs != NULL );
66 LFDS710_PAL_ASSERT( qe != NULL );
70 LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_GET( qs->lock_enqueue_umm );
72 qs->enqueue_umm->next = qe;
75 LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_RELEASE( qs->lock_enqueue_umm );
84 /****************************************************************************/
85 int libbenchmark_datastructure_queue_umm_msvc_spinlock_dequeue_umm( struct libbenchmark_datastructure_queue_umm_msvc_spinlock_state *qs, struct libbenchmark_datastructure_queue_umm_msvc_spinlock_element **qe )
90 LFDS710_PAL_ASSERT( qs != NULL );
91 LFDS710_PAL_ASSERT( qe != NULL );
93 LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_GET( qs->lock_dequeue_umm );
95 if( qs->dequeue_umm == qs->enqueue_umm )
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;
108 LIBBENCHMARK_PAL_LOCK_MSVC_SPINLOCK_RELEASE( qs->lock_dequeue_umm );