vlib_stat_segment_lock (void)
{
stats_main_t *sm = &stats_main;
- clib_spinlock_lock (sm->stat_segment_lockp);
+ vlib_main_t *vm = vlib_get_main ();
+ f64 deadman;
+
+ /* 3ms is WAY long enough to be reasonably sure something is wrong */
+ deadman = vlib_time_now (vm) + 3e-3;
+
+ while (__sync_lock_test_and_set (&((*sm->stat_segment_lockp)->lock), 1))
+ {
+ if (vlib_time_now (vm) >= deadman)
+ {
+ clib_warning ("BUG: stat segment lock held too long...");
+ break;
+ }
+ }
}
void
stat_segment_name = cm->stat_segment_name ?
cm->stat_segment_name : cm->name;
- clib_spinlock_lock (sm->stat_segment_lockp);
+ vlib_stat_segment_lock ();
/* Update hash table. The name must be copied into the segment */
hp = hash_get_pair (sm->counter_vector_by_name, stat_segment_name);
/* Warn clients to refresh any pointers they might be holding */
shared_header->opaque[STAT_SEGMENT_OPAQUE_EPOCH] = (void *)
((u64) shared_header->opaque[STAT_SEGMENT_OPAQUE_EPOCH] + 1);
- clib_spinlock_unlock (sm->stat_segment_lockp);
+ vlib_stat_segment_unlock ();
}
ssvm_pop_heap (oldheap);
}
shared_header = ssvmp->sh;
- clib_spinlock_lock (sm->stat_segment_lockp);
-
+ vlib_stat_segment_lock ();
/* Update hash table. The name must be copied into the segment */
hp = hash_get_pair (sm->counter_vector_by_name, name);
if (hp)
/* Warn clients to refresh any pointers they might be holding */
shared_header->opaque[STAT_SEGMENT_OPAQUE_EPOCH] = (void *)
((u64) shared_header->opaque[STAT_SEGMENT_OPAQUE_EPOCH] + 1);
- clib_spinlock_unlock (sm->stat_segment_lockp);
+ vlib_stat_segment_unlock ();
}
void
shared_header = ssvmp->sh;
- clib_spinlock_lock (sm->stat_segment_lockp);
-
+ vlib_stat_segment_lock ();
error_vector_name = format (0, "/err/%d/counter_vector%c", thread_index, 0);
/* Update hash table. The name must be copied into the segment */
/* Warn clients to refresh any pointers they might be holding */
shared_header->opaque[STAT_SEGMENT_OPAQUE_EPOCH] = (void *)
((u64) shared_header->opaque[STAT_SEGMENT_OPAQUE_EPOCH] + 1);
- clib_spinlock_unlock (sm->stat_segment_lockp);
+ vlib_stat_segment_unlock ();
ssvm_pop_heap (oldheap);
}
if (unformat (input, "verbose"))
verbose = 1;
- clib_spinlock_lock (sm->stat_segment_lockp);
+ vlib_stat_segment_lock ();
/* *INDENT-OFF* */
hash_foreach_pair (p, sm->counter_vector_by_name,
}));
/* *INDENT-ON* */
- clib_spinlock_unlock (sm->stat_segment_lockp);
+ vlib_stat_segment_unlock ();
vec_sort_with_function (show_data, name_sort_cmp);
oldheap = ssvm_push_heap (shared_header);
- clib_spinlock_lock (sm->stat_segment_lockp);
-
+ vlib_stat_segment_lock ();
vlib_node_get_nodes (0 /* vm, for barrier sync */ ,
(u32) ~ 0 /* all threads */ ,
1 /* include stats */ ,
((u64) shared_header->opaque[STAT_SEGMENT_OPAQUE_EPOCH] + 1);
}
- clib_spinlock_unlock (sm->stat_segment_lockp);
+ vlib_stat_segment_unlock ();
ssvm_pop_heap (oldheap);
}