mfib_signal_list_init();
}
+static inline void
+mfib_signal_lock_aquire (void)
+{
+ while (clib_atomic_test_and_set (&mfib_signal_pending.mip_lock))
+ ;
+}
+
+static inline void
+mfib_signal_lock_release (void)
+{
+ clib_atomic_release(&mfib_signal_pending.mip_lock);
+}
+
+#define MFIB_SIGNAL_CRITICAL_SECTION(_body) \
+{ \
+ mfib_signal_lock_aquire(); \
+ do { \
+ _body; \
+ } while (0); \
+ mfib_signal_lock_release(); \
+}
+
int
-mfib_signal_send_one (struct _unix_shared_memory_queue *q,
+mfib_signal_send_one (struct vl_api_registration_ *reg,
u32 context)
{
u32 li, si;
/*
* with the lock held, pop a signal from the q.
*/
- while (__sync_lock_test_and_set (&mfib_signal_pending.mip_lock, 1))
- ;
- {
+ MFIB_SIGNAL_CRITICAL_SECTION(
+ ({
li = clib_dlist_remove_head(mfib_signal_dlist_pool,
mfib_signal_pending.mip_head);
- }
- mfib_signal_pending.mip_lock = 0;
+ }));
if (~0 != li)
{
mfs = pool_elt_at_index(mfib_signal_pool, si);
mfi = mfib_itf_get(mfs->mfs_itf);
mfi->mfi_si = INDEX_INVALID;
- __sync_fetch_and_and(&mfi->mfi_flags,
- ~MFIB_ITF_FLAG_SIGNAL_PRESENT);
+ clib_atomic_fetch_and(&mfi->mfi_flags,
+ ~MFIB_ITF_FLAG_SIGNAL_PRESENT);
- vl_mfib_signal_send_one(q, context, mfs);
+ vl_mfib_signal_send_one(reg, context, mfs);
/*
* with the lock held, return the resoruces of the signals posted
*/
- while (__sync_lock_test_and_set(&mfib_signal_pending.mip_lock, 1))
- ;
- {
+ MFIB_SIGNAL_CRITICAL_SECTION(
+ ({
pool_put_index(mfib_signal_pool, si);
pool_put_index(mfib_signal_dlist_pool, li);
- }
- mfib_signal_pending.mip_lock = 0;
+ }));
return (1);
}
dlist_elt_t *elt;
u32 si, li;
- while (__sync_lock_test_and_set (&mfib_signal_pending.mip_lock, 1))
- ;
- {
+ MFIB_SIGNAL_CRITICAL_SECTION(
+ ({
pool_get(mfib_signal_pool, mfs);
pool_get(mfib_signal_dlist_pool, elt);
clib_dlist_addhead(mfib_signal_dlist_pool,
mfib_signal_pending.mip_head,
li);
- }
- mfib_signal_pending.mip_lock = 0;
+ }));
mfs->mfs_entry = mfib_entry_get_index(mfe);
mfs->mfs_itf = mfib_itf_get_index(mfi);
/*
* it's in the pending q
*/
- while (__sync_lock_test_and_set (&mfib_signal_pending.mip_lock, 1))
- ;
- {
+ MFIB_SIGNAL_CRITICAL_SECTION(
+ ({
dlist_elt_t *elt;
/*
elt = pool_elt_at_index(mfib_signal_dlist_pool, li);
pool_put_index(mfib_signal_pool, elt->value);
pool_put(mfib_signal_dlist_pool, elt);
- }
-
- mfib_signal_pending.mip_lock = 0;
+ }));
}
}